2011-08-13 5 views
0

내 appliaction에는 모든 활동에서 로그 아웃 할 수있는 로그 아웃 버튼이있는 메뉴가 있습니다. 이것은 잘 작동했습니다. 앱의 시작 화면으로 로그 아웃하는 데 사용되었지만 최근에 기기의 홈 화면으로 로그 아웃하도록 변경했습니다. 이제 로그 아웃하여 앱을 열면 강제로 닫힙니다. 앱을 두 번째로 시작하면 올바르게 시작됩니다. , 올바른 의도를 시작 직후응용 프로그램이 잘못 시작됨 활동 및 강제 종료

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 메소드를 호출하지 않습니다. 그 액티비티는 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

Welcome 활동을로드 할 때 수행중인 작업 (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()를 호출하십시오. 앱을 다시 시작하십시오 -> 환영 -> 탭 또는 로그 아웃 -> 로그 아웃 -> 앱 다시 시작

  • 환영 활동은 아직 메모리에 남아 있으며 일시 중지 상태입니다. 따라서 onResume()가 실행되지만에서 onCreate하지()
+0

환영의 onCreate 메서드에서 볼 수 있듯이 ** ** finish() 호출합니다. 그리고 집에서 앱을 시작할 때, ** 환영 메시지의 onResume()을 호출하지 않습니다 ** (LogCat을 사용하여 테스트했습니다). 그것은 닫힐 때 실행중인 활동을 재개하려고 시도합니다. 앱을 새로 시작하고 싶습니다. Intent 플래그가 누락 된 것 같습니다.하지만 어떤 플래그를 사용할 수 있습니까? – Pikaling

관련 문제