2013-01-23 28 views
4

我有一個帶有項目列表的FragmentActivity,當應用程序在後臺時,可以推送到該項目列表。FLAG_ACTIVITY_REORDER_TO_FRONT ignored

發生這種情況時,我想創建狀態欄通知並提醒用戶更新。
當用戶點擊通知時,活動應重新排序並顯示在屏幕上,同時在列表底部顯示新項目。

所以我寫一個通知管理器顯示該用戶設備上:

private static void createNotification(String title, String text, 
    String largeIcon, String itemdId, Context mCOntext) { 

Bitmap ic = BitmapFactory.decodeResource(mContext.getResources(), 
    R.drawable.ic_launcher); 
Intent intent = new Intent(mContext, MyFragmentActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
intent.putExtra(MyFragmentActivity.SELECTED_ITEM_LIST_ID, DatabaseHelper 
    .getItemListById(listId).getId()); 
PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, 
    0); 

Notification noti = new NotificationCompat.Builder(mContext) 
    .setContentTitle(title).setContentText(text) 
    .setSmallIcon(R.drawable.ic_launcher).setContentIntent(pIntent) 
    .setAutoCancel(true).setLargeIcon(ic).build(); 
noti.defaults |= Notification.DEFAULT_LIGHTS; 
noti.defaults |= Notification.DEFAULT_VIBRATE; 
noti.sound = Uri.parse("android.resource://" 
    + mContext.getPackageName() + "/" + R.raw.user_gets_message); 

NotificationManager nm = (NotificationManager) mContext 
    .getSystemService(Context.NOTIFICATION_SERVICE); 
nm.notify(0, noti); 
} 

唯一的問題是,它似乎忽略了自己的旗幟,當我瀏覽到片段活動,然後去我主屏幕(背景應用程序),並獲得推動,當我點擊通知時,應用程序創建一個新的活動(或片段),並顯示新的數據而不是原始數據。 (這意味着點擊後退按鈕會從歷史堆棧中打開相同的活動(或片段)

我覆蓋了onNewIntent以及該活動的所有生命週期方法,並且我看到在返回單擊時,被稱爲是MyFragmentActivity.onStartMyFragmentActivity.onResume

任何想法上它是什麼,我做錯了嗎?

回答

5

我認爲這個問題是您設置的活動發射模式爲singleTask裏面加了標誌FLAG_ACTIVITY_BROUGHT_TO_FRONT到您的意圖,並導致標誌FLAG_ACTIVITY_REORDER_TO_FRONT被忽略。

您需要將啓動模式更改爲單個頂端。

1

標記爲已接受的解決方案存在缺陷,除非我有特殊情況,而且您不遵守。如果你有launchmode =「singleTop」,並且你有一個打開活動A的通知,並且在你的應用程序正在查看活動B(應用程序要麼是最小化,要麼是最大化,即在後臺或前臺,這並不重要),那麼即使FLAG_ACTIVITY_REORDER_TO_FRONT標誌已設置,它仍然會打開活動A的第二個副本。

我的解決方案是讓廣播接收器偵聽通知觸發的廣播操作。所以基本上:

  1. 通知觸發與活動的一個額外的名義發動廣播動作。

  2. 廣播接收機捕獲此被點擊的通知時,然後創建的意圖使用FLAG_ACTIVITY_REORDER_TO_FRONT標誌

  3. 活性被帶到活動堆棧,沒有重複的頂部,以啓動該活性。

相關問題