2011-08-13 151 views
0

我的应用程序具有一个带有注销按钮的菜单,允许您从任何活动注销。这一直工作正常。它用于注销应用程序的欢迎屏幕,但我最近将其更改为注销到设备的主屏幕。现在,当我注销并打开应用程序时,它强制关闭。在第二次尝试启动应用程序时,它将正确启动。应用程序启动错误活动和强制关闭

在第一次尝试,它似乎试图加载在用户注销时正在运行的活动,尽管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。正如你所看到的,它表示'没有登录',然后启动欢迎活动,然后继续进行。有任何想法吗?

+0

请发布完整的例外情况,以及您在加载欢迎活动时的行为(onStart( ))。你正在加载值? – Jack

+0

完整的异常并不令人感兴趣 - 它仅仅是数据库连接的NPE,显然还没有重新启动,因为它没有启动正确的Activity。欢迎活动的onCreate方法根据SharedPreferences重定向到另一个活动,但onCreate方法中没有任何LogCat语句出现,因此它不会启动。我已经将该方法添加到了我的问题中,因此您可以看到 – Pikaling

回答

0

我加入这个到的onPause()我超类的方法解决了这个问题:

if(!preferences.contains(EMAIL_ADDRESS)) { // this means the user has logged out 
    finish(); 
} 

现在,当用户注销时,所有活动正确完成。我也将它重新注册到登录屏幕上,而不是在看完这篇文章后退出到设备的主屏幕:Is quitting an application frowned upon?

0

如果您注销回到主屏幕,它向我建议,当您从家里启动应用程序时,您只希望看到一次欢迎屏幕?

如果这是正确的,那么在欢迎onCreate(),在启动标签或登录活动之前调用finish()。现在你已经回家了 - > welcome-> tabs_or_login->注销 - >再次启动应用程序

  • 然而,欢迎活动仍在内存中,只能暂停。这样的onResume()将运行,但不会的onCreate()
+0

从Welcome的onCreate方法中可以看到,它**可以调用finish()。当我从家里启动应用程序时,它**不会**调用Welcome的onResume()(我已经使用LogCat进行了测试)。它只是试图恢复关闭时运行的活动。我希望应用程序重新开始。我想我可能会错过一个意图标志,但我无法确定哪一个 – Pikaling

相关问题