我有一個使用Urban Airship用於推送通知的應用程序。當通知到達並且用戶點擊它時,應用程序中的活動A應該打開並執行一些操作。活動打開兩次
我已經安裝BroadcastReceiver
如圖所示in the docs,它的幾乎工作。
- 當我的應用程序在前臺時,我不讓用戶看到通知,只是自動處理它。
- 當我的應用程序根本沒有運行時,活動開啓得很好。
- 當我的應用程序在背景中(其總是會發生當A是頂端活動),活動A的第二實例被創建。
這是當然的,出了問題。我不想要兩個A活動,我只想要其中的一個。下面是相關的BroadcastReceiver
代碼:
@Override
public void onReceive(Context ctx, Intent intent)
{
Log.i(tag, "Push notification received: " + intent.toString());
String action = intent.getAction();
int notificationId = intent.getIntExtra(PushManager.EXTRA_NOTIFICATION_ID, -1);
if(action.equals(PushManager.ACTION_NOTIFICATION_OPENED))
{
Intent intentActivity = new Intent(ctx, ActivityA.class);
intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
UAirship.shared().getApplicationContext().startActivity((intentActivity);
}
}
更新: 我試圖通過調用System.exit(0)
當用戶按下後退上的活動A.過程結束繞過這個bug,但隨後立即重新啓動!我的廣播接收器不會再次被調用。發生了什麼?
更新2: @codeMagic詢問了有關應用程序和活動A.
這個程序可以讓其用戶檢討某些項目和評論對他們的更多信息。活動A在應用程序啓動時啓動。如果用戶的會話不再有效,則啓動登錄活動。用戶登錄後,活動A再次變爲活動狀態。 A只有一個「No items to review」消息和一個「立即嘗試」按鈕。
當用戶登錄時,服務器開始發送推送通知,每當有新產品供審查。當應用程序獲取通知時,活動A訪問服務器並獲取下一個項目以供查看。該項目顯示在活動B中。一旦將評論提交給服務器,活動B完成,活動A再次成爲最高活動。
當用戶正在審查的項目(因爲活動所取的話)的服務器知道,直到審查提交不發送推送通知 - 意思是通知不能來,如果用戶沒有登錄或者如果用戶正在查看活動B.
儘管我同意這裏存在細微的競爭條件,但它並不會導致我所看到的問題 - 在測試中,我100%肯定沒有競爭條件 - 推送通知僅在後發送活動A再次變爲活動狀態。
是活動你的應用程序或第三方活動,如相機的一部分..? – 2013-05-01 21:57:08
我自己的活動。 – zmbq 2013-05-01 21:57:32
我可能是錯的,但從您所描述的內容來看,聽起來並不像「Activity A」必須是「Activity」,但可能是「Service」或「BroadcastReceiver」。如果它只是監視更新並通知'活動B'或如果沒有項目顯示消息,則可以顯示'活動B'的消息 – codeMagic 2013-05-02 12:40:03