按:
将根據需求,寫寫整個思路。
一,需求
應用第一次啟動後,在通知欄裡顯示FLAG_ONGOING_EVENT類型的通知。點選之後消失,将在以下三種情況下,回到應用:
第一種: 目前顯示------------------回到目前頁
第二種: 背景------------------------回到目前頁
第三種: 退出應用-----------------啟動應用
二,解決方案
方案1:launcher方式啟動應用
一些啟發:很顯然,launcher的啟動方式完美解決以上三種情況,并且可以預估,代碼量将會很少。
可行性:不可行。
原因:通知是事件滞前性的,我們先設定了PendingIntent,但是當在應用中浏覽時,之前制定的pendingIntent已經不能到達我們的目前頁面。
launcher啟動的原理:
對比之下,簡單的猜測了下launcher啟動應用的原理,顯然,launcher之是以能很好的處理以上三種情況,是因為,它是事件滞後的。流程如下:
step1: 點選應用圖示,擷取應用包名
step2: 擷取此包名下的activity task,得到topAcitivty
step3: intent指向此topAcitivity即可。
方案2:動态更新Notification
通過方案1,顯然,隻要進入新的Activity,動态更新通知即可。
可行性: 不可行
原因:此需求是新增加的,如果按照此方案,代碼的改動會非常大。而且會影響性能。而且此功能并沒有這麼重要。
方案3:修改Launcher mode,讓應用自動回到棧頂。
代碼上比較簡單。activity的launch mode 修改為single top即可。
可行性:不可能,基于以往的需求,主要的幾個Activity均為single task,不确定這樣的改動是否會引用新的bug,是以不采用此改動。
相關代碼如下:
public void showInstallReminderNotification() {
if (mNotification == null) {
mNotification = new Notification();
}
if (mPendingIntent == null) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setClass(this.mContext, MainActivity.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
mPendingIntent = PendingIntent.getActivity(this.mContext, 0,
intent, 0);
}
mNotification.defaults = Notification.DEFAULT_LIGHTS;
mNotification.icon = R.drawable.ic_launcher;
mNotification.flags = Notification.FLAG_ONGOING_EVENT;
RemoteViews remoteViews = new RemoteViews(
this.mContext.getPackageName(), R.layout.remote_view);
remoteViews.setTextViewText(R.id.textview, "this is my test");
mNotification.contentView = remoteViews;
mNotification.contentIntent = mPendingIntent;
mNotificationManager.notify(123, mNotification);
}
Note:
做了驗證:
1,不設定launcher mode,也能達到同樣的效果。
2,設定launcher mode為single task,不會生效。
相關的具體的差别還沒有仔細看,未來會寫出。
方案4:Service擷取TopActivity
方式:點選通知,啟動service,擷取topAcitivty
可能性:此方案,其實是将Notification的事件置前性轉化為置後
可行性:不可行
原因:Service啟動Activity時,會new task,原有的資料可能會丢失。
方案5:指定到達的Activity
參看了其他的應用,qq音樂,其實都是制定了通知欄到達的頁面,大概也有以上三種方案的考慮。
分解需求為兩部分:
第一部分,如果應用啟動,回到目前頁面。(MainActivity)
第二部分,如果應用關閉,啟動應用。(SplashActivity)
實作:
1,預設PendingIntent指向MainAcitivty
2,退出時,更新PendingIntent到SplashActivity
三,總結:方案5
優點:
1,基本滿足了需求
2,保證了代碼的簡潔和穩定性