我的應用程序具有一個帶有註銷按鈕的菜單,允許您從任何活動註銷。這一直工作正常。它用於註銷應用程序的歡迎屏幕,但我最近將其更改爲註銷到設備的主屏幕。現在,當我註銷並打開應用程序時,它強制關閉。在第二次嘗試啓動應用程序時,它將正確啓動。應用程序啓動錯誤活動和強制關閉
在第一次嘗試,它似乎試圖加載在用戶註銷時正在運行的活動,儘管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。正如你所看到的,它表示'沒有登錄',然後啓動歡迎活動,然後繼續進行。有任何想法嗎?
請發佈完整的例外情況,以及您在加載歡迎活動時的行爲(onStart( ))。你正在加載值? – Jack
完整的異常並不令人感興趣 - 它僅僅是數據庫連接的NPE,顯然還沒有重新啓動,因爲它沒有啓動正確的Activity。歡迎活動的onCreate方法根據SharedPreferences重定向到另一個活動,但onCreate方法中沒有任何LogCat語句出現,因此它不會啓動。我已經將該方法添加到了我的問題中,因此您可以看到 – Pikaling