2016-03-25 30 views
0

我的應用的啓動器活動被稱爲LaunchActivity。在這個活動中,我檢查用戶是否登錄。如果是,則進行網絡呼叫以驗證用戶,如果一切正常MainActivity已啓動。如果用戶第一次運行應用程序或用戶驗證失敗,則運行LoginActivityAndroid - 重新打開通知的主要活動

裏面LaunchActivity有運行適當的活動功能:

private void start(Class<? extends Activity> startActivity) { 

    Intent intent = new Intent(this, startActivity); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    finish(); 
    startActivity(intent); 
} 

應用程序正在接收通知。通知後點擊我想打開應用程序或將它放在最前面,如果它在後臺。

代碼負責通知的意圖:

Intent intent = new Intent(context, LaunchActivity.class); 
    intent.putExtra("SHOW_NOTIFICATION_LIST", ""); 
    intent.setAction(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 

    PendingIntent notificationIntent = PendingIntent.getActivity(
      context, 
      0, 
      intent, 
      0); 
    builder.setContentIntent(notificationIntent); 

    Notification notification = builder.build(); 

的問題是,我點擊後當前的實現,LaunchActivity被重新打開,即使MainActivity是背景。我無法弄清楚如何使待處理的意圖重新開放,如果它在後臺或開始LaunchActivity當沒有任何活動在後臺運行(應用程序未運行)時,重新啓動MainActivity(不包含LaunchActivity和valdation)。我會非常感激任何形式的幫助。

編輯:

 <activity android:name=".activities.LaunchActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".activities.MainActivity" 
     android:launchMode="singleTop" 
     android:screenOrientation="userPortrait" /> 
    <activity 
     android:name=".activities.LoginActivity" 
     android:excludeFromRecents="true" 
     android:launchMode="singleTop" 
     android:noHistory="true" 
     android:screenOrientation="userPortrait" 
     android:windowSoftInputMode="adjustResize" > 
    </activity> 
+0

請張貼您的Manifest文件。 –

+0

添加到問題 – Dominik

回答

0

的原因荒謬行爲是因爲你完成LaunchActivity當你調用start()

private void start(Class<? extends Activity> startActivity) { 

    .... 
    finish(); // This is the culprit 
    .... 
} 

取下start()finish()如預期它會正常工作。

如果你不能因爲你的應用程序的行爲刪除finish(),然後改變你的PendingIntent推出MainActivity代替LaunchActivity

Intent intent = new Intent(context, MainActivity.class); 

而且在MainActivity's onCreate()檢查,如果用戶已經登錄。如果沒有,那麼導航他到你的LoginActivity

+0

我不認爲這是問題 - 在我開始MainActivity之前我需要完成啓動活動,因爲不再需要 - 它只是中間活動 – Dominik

+0

編輯我的答案。 –

+0

我剛剛刪除完成(),它的效果很好。但你能解釋爲什麼這種方式真的有效嗎?如果沒有finish(),LaunchActivity仍然存在,那麼爲什麼在掛起的intent觸發後,MainActivity會返回到頂部而不是LaunchActivity? (在我的情況LaunchActivity也有應用程序飛濺視圖) – Dominik

0

創建一個BroadcastReceiver其反應到三個不同的意圖

  • ACTION_CREATED:設置標誌爲true
  • ACTION_DESTROYED:設置標誌

    活動中艙單申報爲假

  • ACTION_LAUNCH:如果標誌,啓動MainActivity,否則啓動LaunchActivity

(標誌可以是例如在sharedpreferences一個布爾或靜態字段)

MainActivity

    onCreate
  • :發送ACTION_CREATED廣播
  • onDestroy:發送ACTION_DESTROYED廣播

該通知應發送ACTION_LAUNCH廣播。

注意:操作可以命名爲任何你想要的。他們也應該從包名稱開始,以免干擾其他應用程序。

+0

聽起來不錯 - 我只是簡單的控制MainActivity的生命週期,但是當用戶點擊通知時我能夠發送廣播意圖嗎? – Dominik

+0

只是使用'PendingIntent.getBroadcast'而不是'PendingIntent.getActivity' – F43nd1r