2011-08-13 9 views
0

マイアプリケーションには、ログアウトボタンが付いたメニューがあり、アクティビティからログアウトすることができます。これはうまくいきました。それは、アプリケーションのようこそ画面にログアウトするために使用されましたが、私は最近、デバイスのホーム画面にログアウトするように変更しました。今、私がログアウトしてアプリを開くと、強制的に閉じます。 2回目のアプリケーションの起動時に、正しく起動します。アプリケーションの開始が間違っているアクティビティと強制終了

の最初の試みで、ユーザーが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); 
    } 
} 

編集:

だけでなく、それは始まっています間違ったアクティビティ、onCreateメソッドを呼び出さないoそのアクティビティは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だけですが、正しいアクティビティを開始していないため、明らかに再起動されていません。ウェルカムアクティビティの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-> logout->再びアプリを起動

  • ウェルカムアクティビティはまだメモリに残っており、一時停止中です。したがって、onResume()が実行されますが、のonCreateない()
+0

ようこそのonCreateメソッドから見ることができます** ** **終了を呼び出します。そして、私が自宅からアプリを起動すると、** WelcomeのonResume()を呼び出さない**(私はLogCatを使ってテストした)。閉じたときに実行されていたアクティビティを再開しようとします。私はアプリを新鮮にしたい。私はおそらくインテントの旗が欠けていると思っていますが、私はそれを解決できません – Pikaling

関連する問題