天天看點

由通知欄進入到應用的嘗試

按:

将根據需求,寫寫整個思路。

一,需求

應用第一次啟動後,在通知欄裡顯示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,保證了代碼的簡潔和穩定性

繼續閱讀