android笔记,点击notification时的跳到栈顶
github地址:https://github.com/ppg408331701/notificationdemo
之前有一个需求,当用户点击APP常驻在通知栏的notification时,有两种情况要处理:
1.用户之前打开过APP,APP的栈中存在有几个activity时,用户点击notification跳转到栈顶的activity. 比如,主页——个人中心——修改密码.
这时用户按home键去做其他的事情,当用户点击通知栏的通知时跳转到栈顶的修改密码
2.用户APP的栈内没有任何activity,当用户点击通知栏的通知时,跳转到设置好的主页.(通知栏的通知是常驻型的,即使APP被系统或安全软件杀死也会保留在通知栏)
构造一个常驻在通知栏的通知
//前台通知
public static void OpenNotification(Context context) {
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
RemoteViews mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_view);
mRemoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_android);
//API3.0 以上的时候显示按钮,否则消失,后来发现不需要考虑3.0的问题,就直接设置成true了,
if (true) {
mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.mipmap.devce);
} else {
mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.ic_android);
}
//点击的事件处理
Intent buttonIntent = new Intent(ACTION_BUTTON);
buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID);
//点击的事件处理
Intent button2Intent = new Intent(ACTION_BUTTON);
button2Intent.putExtra(INTENT_BUTTONID_TAG, webapps);
//这里加了广播,所及INTENT的必须用getBroadcast方法
PendingIntent intent_prev = PendingIntent.getBroadcast(context, 101, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent intent2 = PendingIntent.getBroadcast(context, 102, button2Intent, PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play, intent_prev);
mRemoteViews.setOnClickPendingIntent(R.id.login, intent2);
mBuilder.setContent(mRemoteViews)
.setContentIntent(getDefalutIntent(context, Notification.FLAG_ONGOING_EVENT))
.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示
// .setTicker("正在播放")
.setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级
.setOngoing(true)//标识是否是一个正在进行中的通知
.setSmallIcon(R.drawable.ic_android);
Notification notify = mBuilder.build();
notify.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
mNotificationManager.notify(NOTIFICATION_FLAG, notify);
// ((Service)context).startForeground(1,notify);//设置为前台服务级别的通知.不会随app死亡而被杀死,必须是service生成的通知才行
}
设置跳转事件
/**
* 当app在屏幕中时,点击不会有反应,
* 当app隐藏时,点击弹出栈顶的activity
* 当app死亡时,点击从设定好的LoginActivity开始
*/
public static PendingIntent getDefalutIntent(Context context, int flags) {
// Intent intent = new Intent();
// intent.setClass(context, LoginActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
// PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, flags);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(context, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, flags);
return pendingIntent;
}
其中Intent.ACTION_MAIN和intent.addCategory(Intent.CATEGORY_LAUNCHER);这两句必不可少
LoginActivity.class就是相当于设置好的主页,APP已死的情况下就会跳转到这个类中
/**
* 更新通知
* @param context
* @param msg 更新的内容
*/
public static void UpdataNotification(Context context, String msg) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
RemoteViews mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_view);
mRemoteViews.setTextViewText(R.id.custom_song_singer, msg);
mBuilder.setContent(mRemoteViews)
.setContentIntent(getDefalutIntent(context, Notification.FLAG_ONGOING_EVENT))
.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示
// .setTicker("正在播放")
.setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级
.setOngoing(true)
.setSmallIcon(R.drawable.ic_android);
Notification notify = mBuilder.build();
notify.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
if (mNotificationManager == null) {
mNotificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
}
mNotificationManager.notify(NOTIFICATION_FLAG, notify);
}