2015-06-17 71 views
3

Notification類的文件我看到這一點:Android通知:是否需要Intent.FLAG_ACTIVITY_NEW_TASK?

公衆的PendingIntent contentIntent

點擊展開的狀態項時執行的意圖。如果這是一項活動,則必須包含FLAG_ACTIVITY_NEW_TASK標誌,該標誌要求您負責Tasks and Back Stack文檔中所述的任務管理。特別是,請務必閱讀通知部分Handling Notifications以瞭解從通知啓動應用程序的正確方法。

我讀過上面鏈接的材料,但我仍然沒有得到它。爲什麼在點擊通知開始活動時需要標記FLAG_ACTIVITY_NEW_TASK?我嘗試下面的代碼:

NotificationManager manager = (NotificationManager)context. 
    getSystemService(Context.NOTIFICATION_SERVICE); 
Notification notification = new Notification(
    android.R.drawable.stat_notify_sync, title, 
    System.currentTimeMillis()); 
notification.flags |= Notification.FLAG_AUTO_CANCEL; 
Intent intent = new Intent(context, NotifiedActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // IS THIS REALLY REQUIRED?? 
PendingIntent pt = PendingIntent.getActivity(context, 0, intent, 0); 
notification.setLatestEventInfo(context, title, text, pt); 
manager.notify(0, notification); 

我跑了上面的代碼,既沒有了intent.setFlags線,而且似乎是沒有什麼區別。事實上,我發現的許多代碼示例根本沒有這一行。那麼爲什麼文檔說FLAG_ACTIVITY_NEW_TASK標誌是必須的,在通知處理中它究竟有什麼不同?

回答

8

技術上這個標誌是必需的。但由於它是必需的,Android是好的,只是將它設置爲你;-)

需要它的理由如下:

處理該Notification,並呼籲startActivity()實際啓動Intent代碼,不在「任務」中運行。它是系統代碼,是Notification系統的一部分。通常情況下,如果您撥打startActivity()並且標記Intent.FLAG_ACTIVITY_NEW_TASK未設置,Android會嘗試將該Activity啓動到當前任務中(即:包含正在調用startActivity()的Activity的任務)。因爲,在這種情況下,是沒有任務,Android 必須啓動Activity到另一個任務。這就是爲什麼你需要指定Intent.FLAG_ACTIVITY_NEW_TASK

實際上,這並不總是會創建新任務,因爲Android會首先嚐試找到一個(合適的)現有任務來啓動Activity。如果您的應用程序已在運行,則Android會將該活動啓動到該任務中。 (這不是100%真實的,還有其他特殊情況可以改變這種邏輯,但我不打算在這裏解決它們)。

注意:如果您從ServiceBroadcastReceiver調用startActivity(),則存在相同的情況。在那些情況下,國旗Intent.FLAG_ACTIVITY_NEW_TASK必須設置爲,因爲沒有「當前任務」,所以Android 必須將啓動到其他任務。

+1

非常明確的解釋。謝謝! – ycsun

相關問題