2011-08-13 186 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

相關問題