android笔记,点击notification时的跳到栈顶

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值