首先,在我讨论我的主要问题之前,我将解释我的应用情况。首先,我想知道我处理活动的方式是否是处理活动的正确方式,因为我觉得这可能不会导致我的问题。
目前我有3个活动设置。 Main.class,Login.class和Display.class。 Main活动根本没有任何与之关联的UI,它会启动其他活动。因此,启动应用程序时启动的第一个活动是Main活动,无论用户是否登录,它都会从SharedPreferences存储中读取。如果他们未登录,则会打开Login。 class,如果他们登录,它将打开Display.class(两者都有与之关联的UI)。它使用startActivityForResult()。
由于我决定使用活动的方式,我需要覆盖Login.class和Display.class上的后退按钮:否则,它将返回Main.class,并重新运行启动活动序列,它将重新启动刚刚运行的活动(因此后退按钮无用)。因此,我重写后退按钮以发回-1的整数,然后完成()当前活动。我已经覆盖了Main.class的onActivityResult(int,int,Intent),如果它收到-1,它也将完成(),而不是尝试重新启动活动。
现在,这一切都符合我的要求,虽然我觉得处理活动是完全错误的方式,但这会让我在以后的赛道上出现问题。
在我的应用程序中,我决定将app小部件和通知放入其中,这两个小部件都将在单击时打开应用程序(通过启动Main.class的意图)。我把它全部工作,以便它可以做到这一点,虽然看起来好像开始一个新的活动会导致问题。
基本上,如果应用程序已在运行,并且有人下拉通知并点击它,它将打开同一应用程序的新活动。这是有问题的,特别是在我处理后退按钮的方式时:当你打开一个新按钮时,按下后退按钮,它将关闭新按钮(如预期的那样),但是会将你带回到旧按钮。然后你可以再次按下后退按钮并退出它,但显然我不想发布一个需要按下后退按钮两次的应用程序。解决这个问题的最佳方法是什么?如果这是问题的主要部分,我很乐意完全改变我处理活动的方式。
谢谢, 约什
答案 0 :(得分:1)
我有一种感觉,我不完全理解问题的深度,所以如果我说的是你已经尝试过的话,请原谅我。
但是你不能删除Main并从Display启动Login吗?我的意思是,更有意义。这就是我在这里所做的事情,当我需要必须填充主要活动数据的附件活动时(显然是在你的情况下显示)。当您从登录返回时,您可以执行所需的所有检查。例如,您可以允许“只读”显示,您可以提供对话框警告......
你确实会省去很多麻烦和无用的代码(大多数结果/意图意大利面)。
答案 1 :(得分:1)
实际上你如何设置-1(这很好)然后调用finish()是完全可以接受的。我忘记了属性值,但是如果你只想要一个Activity的单个实例,有一种方法可以在清单中设置它...任务关联或其中一个值 - 你必须查找它。
作为替代方法,您可以覆盖Application类并使用自己的类来管理应用程序状态。可以把它想象成主Activity的单例跟踪器。“如果它已经存在则使用那个,否则创建一个新实例”的东西。在创建主Activity时,在新扩展的Application类中设置一个引用(确保在main关闭时将其清空),然后在onCreate()再次触发时检查引用是否可用...如果有引用已经使用Main的实例..如果没有,继续正常并设置它。
思考的食物......
答案 2 :(得分:1)
一种可行的方法是让一个类扩展Application
,并绑定几个Activity
。 private boolean logged
值可以确定Display
是否需要将LogIn
调用到前台。
public class MyApp extends Application {
private static boolean logged = false;
private Activity logInActivity;
private Activity displayActivity;
public void onCreate () {
super.onCreate();
}
public void setDisplayActivity (Activity act) {
displayActivity = act;
}
public void setLogInActivity (Activity act) {
logInActivity = act;
}
public void finishActivities (Activity act) {
activity.finish();
}
public void setLogged (boolean logged) {
this.logged = logged;
}
public boolean isLogged () {
return logged;
}
public Activity getLoginActivity() {
return logInActivity;
}
public Activity getDisplayActivity() {
return displayActivity;
}
}
class Display extend Activity {
private MyApp app;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (MyApp) getApplicationContext();
if (!app.isLogged()) {
// start LogInActivity. After log in, it will call app.setLogged (true);
}
else {
// continue with Display;
}
}
}