我是靠谱客的博主 呆萌热狗,最近开发中收集的这篇文章主要介绍android-Notification点击跳转指定的Activity,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天项目中有这样的一个需求,当程序还没被进程“杀死”的时候,后台推送来了一则消息,这时候不管是程序在前台运行,还是后台中,需要我们以通知栏的方式来通知用户。
对于通知栏,用户操作后有两种情况。
1.当程序在前台运行的时候,点击后,直接跳到目标Activity,此时,点击返回键是回到上个页面
2.点击通知栏后,先启动App,然后再跳到目标页面,此时,按下返回键是回到App的首页,而不至于退出App

第一种情况实现:
这种情况比较容易,只要直接在PendingIntent 中指定Activity中即可

Intent intent = new Intent(getApplicationContext(), SplashActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT); 

因此第一种情况,结合创建一个通知栏的代码结合就是:


NotificationManager barmanager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notice;
Notification.Builder builder = new Notification.Builder(contxt).setTicker(message)
.setSmallIcon(R.drawable.ic_launcher).setWhen(System.currentTimeMillis());
Intent appIntent=null;
appIntent = new Intent(context,ActivitySplash.class);
appIntent.setAction(Intent.ACTION_MAIN);
appIntent.addCategory(Intent.CATEGORY_LAUNCHER);
appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
PendingIntent contentIntent =PendingIntent.getActivity(context, 0,appIntent,PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notice = builder.setContentIntent(contentIntent).setContentTitle(title).setContentText(content).build();
notice.flags=Notification.FLAG_AUTO_CANCEL;
barmanager.notify(10,notice);
}

我们在创建PendingIntent的时候需要注意参数PendingIntent.FLAG_CANCEL_CURRENT
这个标志位用来指示:如果当前的Activity和PendingIntent中设置的intent一样,那么就要先取消当前的Activity,用PendingIntent中指定的Activity取代之。
另外,需要在Manifest中对指定的Activity设置属性

<activity android:name=".SplashActivity.class"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>

相对于第一种情况,第二种情况稍微复杂点,因为如果只打开目标页面,DetaitActivity,程序并没办法知道他的上一级Activity是谁,所以需要在点击Notification时打开一组Activity,但是我们并不需要一个个去调用startActivity方法,PendingIntent提供了个静态方法getActivities,里面可以设置一个Intent数组,用来指定一系列的Activity。
所以我们首先写一个函数创建一个Activity数组

 //任务栈
Intent[] makeIntentStack(Context context) {
Intent[] intents = new Intent[2];
intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.root.activity.MainActivity.class));
intents[1] = new Intent(context,
com.example.activity.ActiveDetailActivity.class);
return intents;
}

其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity
接下来,我们需要创建并显示通知栏:

 NotificationManager barmanager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notice;
Notification.Builder builder = new Notification.Builder(contxt).setTicker(message)
.setSmallIcon(R.drawable.ic_launcher).setWhen(System.currentTimeMillis());
Intent[] appIntent=null;
appIntent=makeIntentStack(context);//上面有改方法
appIntent[1].setAction(Intent.ACTION_MAIN);
appIntent[1].addCategory(Intent.CATEGORY_LAUNCHER);
appIntent[1].setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);//关键的一步,设置启动模式
PendingIntent contentIntent =PendingIntent.getActivities(context, 0,appIntent,PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
notice = builder.setContentIntent(contentIntent).setContentTitle(title).setContentText(content).build();
notice.flags=Notification.FLAG_AUTO_CANCEL;
barmanager.notify(10,notice);
}

然后功能基本是这样实现了,很感谢这篇博客的启发:

http://blog.csdn.net/shareus/article/details/50364705

最后

以上就是呆萌热狗为你收集整理的android-Notification点击跳转指定的Activity的全部内容,希望文章能够帮你解决android-Notification点击跳转指定的Activity所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部