按:

将根据需求,写写整个思路。


一,需求

应用第一次启动后,在知栏里显示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,保证了代码的简洁和稳定性


缺点:

其他页面将直接引导到主界面(MainActivity,内容的展示页面)