应用程序启动错误活动和强制关闭
我的应用程序具有一个带有注销按钮的菜单,允许您从任何活动注销。这一直工作正常。它用于注销应用程序的欢迎屏幕,但我最近将其更改为注销到设备的主屏幕。现在,当我注销并打开应用程序时,它强制关闭。在第二次尝试启动应用程序时,它将正确启动。应用程序启动错误活动和强制关闭
在第一次尝试,它似乎试图加载在用户注销时正在运行的活动,尽管logcat中显示它开始正确的意图:
08-13 17:14:18.983: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=uk.ac.ic.doc.vmw10.wherewolf/.activities.Welcome }
08-13 17:14:19.053: VERBOSE/WWA(8611): setting up
08-13 17:14:19.064: DEBUG/AndroidRuntime(8611): Shutting down VM
08-13 17:14:19.064: WARN/dalvikvm(8611): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-13 17:14:19.083: ERROR/AndroidRuntime(8611): FATAL EXCEPTION: main
08-13 17:14:19.083: ERROR/AndroidRuntime(8611): java.lang.RuntimeException: Unable to resume activity {uk.ac.ic.doc.vmw10.wherewolf/uk.ac.ic.doc.vmw10.wherewolf.activities.Tabs}: java.lang.NullPointerException
立即启动正确的意图后,会从错误的活动输出详细消息,然后由于NullPointerException而导致应用程序崩溃。 为什么它不启动欢迎活动,因为意图宣称它是?
这里的注销功能:
public void logout() {
SharedPreferences.Editor prefEditor = preferences.edit();
prefEditor.remove(PASSWORD);
prefEditor.remove(FIRST_NAME);
prefEditor.remove(LAST_NAME);
prefEditor.remove(EMAIL_ADDRESS);
prefEditor.remove(DATE);
prefEditor.remove(PICTURE);
prefEditor.remove(TOKEN);
prefEditor.commit();
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
syncTask.cancel(true);
dbHelper.close();
dbHelper=null;
firstRun = true;
startActivity(intent);
}
编辑:下面是欢迎活动的onCreate方法:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Log.v(TAG, "preferences: "+preferences.getAll());
if(preferences.contains(WhereWolfActivity.EMAIL_ADDRESS)) {
Log.v(TAG, "user preferences saved from previous session: "+preferences.getAll().toString());
intent = new Intent(getApplicationContext(), Tabs.class);
startActivity(intent);
finish();
}
else if(preferences.contains(WhereWolfActivity.USER_ID) &! preferences.contains(WhereWolfActivity.EMAIL_ADDRESS)) {
Log.v(TAG, "known user returning to log in");
intent = new Intent(getApplicationContext(), Login.class);
startActivity(intent);
finish();
}
else {
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.welcome);
}
}
编辑:
它不仅是开始错误的Activity,它不会调用onCreate方法o f该Activity,但它确实调用onStart。这表明它正试图从停止的地方回升,尽管这不是我想要的!我如何说服它不要这样做?
编辑:
由于所有我的“登录”活动的有他们继承父类,我加了一下,那个超类的调用onStart()方法,如果用户登录,将检查,如果不将启动欢迎活动:
public void onStart() {
super.onStart();
if(!preferences.contains(EMAIL_ADDRESS)) {
Log.v(TAG, "not logged in");
Intent intent = new Intent(getApplicationContext(), Welcome.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
这没有奏效。以下是LogCat输出:
08-13 20:41:10.223: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=uk.ac.ic.doc.vmw10.wherewolf/.activities.Welcome }
08-13 20:41:10.254: VERBOSE/WWA(2171): not logged in
08-13 20:41:10.263: INFO/ActivityManager(59): Starting activity: Intent { flg=0x4000000 cmp=uk.ac.ic.doc.vmw10.wherewolf/.activities.Welcome }
08-13 20:41:10.273: VERBOSE/WWA(2171): setting up
08-13 20:41:10.320: DEBUG/AndroidRuntime(2171): Shutting down VM
08-13 20:41:10.320: WARN/dalvikvm(2171): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-13 20:41:10.343: ERROR/AndroidRuntime(2171): FATAL EXCEPTION: main
08-13 20:41:10.343: ERROR/AndroidRuntime(2171): java.lang.RuntimeException: Unable to resume activity {uk.ac.ic.doc.vmw10.wherewolf/uk.ac.ic.doc.vmw10.wherewolf.activities.Tabs}: java.lang.NullPointerException
超类有标记WWA。正如你所看到的,它表示'没有登录',然后启动欢迎活动,然后继续进行。有任何想法吗?
我加入这个到的onPause()我超类的方法解决了这个问题:
if(!preferences.contains(EMAIL_ADDRESS)) { // this means the user has logged out
finish();
}
现在,当用户注销时,所有活动正确完成。我也将它重新注册到登录屏幕上,而不是在看完这篇文章后退出到设备的主屏幕:Is quitting an application frowned upon?
如果您注销回到主屏幕,它向我建议,当您从家里启动应用程序时,您只希望看到一次欢迎屏幕?
如果这是正确的,那么在欢迎onCreate(),在启动标签或登录活动之前调用finish()。现在你已经回家了 - > welcome-> tabs_or_login->注销 - >再次启动应用程序
- 然而,欢迎活动仍在内存中,只能暂停。这样的onResume()将运行,但不会的onCreate()
从Welcome的onCreate方法中可以看到,它**可以调用finish()。当我从家里启动应用程序时,它**不会**调用Welcome的onResume()(我已经使用LogCat进行了测试)。它只是试图恢复关闭时运行的活动。我希望应用程序重新开始。我想我可能会错过一个意图标志,但我无法确定哪一个 – Pikaling
请发布完整的例外情况,以及您在加载欢迎活动时的行为(onStart( ))。你正在加载值? – Jack
完整的异常并不令人感兴趣 - 它仅仅是数据库连接的NPE,显然还没有重新启动,因为它没有启动正确的Activity。欢迎活动的onCreate方法根据SharedPreferences重定向到另一个活动,但onCreate方法中没有任何LogCat语句出现,因此它不会启动。我已经将该方法添加到了我的问题中,因此您可以看到 – Pikaling