按:
将根据需求,写写整个思路。
一,需求
应用第一次启动后,在通知栏里显示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,内容的展示页面)
转载于:https://blog.51cto.com/mikewang/1263841