ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 8.1版本广播发送问题

2019-07-19 10:37:17  阅读:431  来源: 互联网

标签:8.1 mNotificationManager 广播 intent activity msg new Android com


今天在写通知栏自定义RemoteView事件时,用了广播处理点击事件,发送一个广播,接收时收不到,出现了这个log

我的写法:使用的隐式方式发送广播。

查资料后发现,Android O版本对后台进程做了限制广播的发送,对隐式广播也做了限制;

优先使用动态注册Receiver的方式,能动态注册绝不使用Manifest注册

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.zzk.notificationtest");
MusicReceiver receiver = new MusicReceiver();
registerReceiver(receiver, intentFilter);

如果非要用Manifest注册,可以有以下三种方法实现,

Intent intent = new Intent();
方法1:
intent.setAction("com.broadcast.test.action");
intent.setPackage("com.broadcast.test.demo");
方法2:
intent.setClassName("com.broadcast.test.demo", "com.broadcast.test.demo.MyReceiver");
方法3:
intent.setComponent(new ComponentName("com.broadcast.test.demo", "com.broadcast.test.demo.MyReceiver"));
getApplicationContext().sendBroadcast(intent);

如果要接收系统广播,其对应的广播在Android8.0中无法被接收,可以把App的targetSdkVersion改为25或以下。

现在就可以接收到了,如下点击关闭弹出一个Toast

广播代码

public class MusicReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action=intent.getAction();
        if (action != null && action.equals("close")) {
            if(MainActivity.myHandler!=null){
                MainActivity.myHandler.sendEmptyMessage(MainActivity.MESSAGE_CLOSE);
            }
        }
    }
}

对应Handler代码

public static class MyHandler extends Handler{

        private final WeakReference<Activity>mActivity;
        private NotificationManager mNotificationManager;
        private Intent mIntent;

        @RequiresApi(api = Build.VERSION_CODES.O)
        private MyHandler(Activity activity){
            mActivity=new WeakReference<>(activity);
            init(activity);
        }

        @RequiresApi(api = Build.VERSION_CODES.O)
        private void init(Activity activity) {
            mNotificationManager = (NotificationManager) activity.getSystemService(NOTIFICATION_SERVICE);
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,"my_channel",NotificationManager.IMPORTANCE_DEFAULT);
            channel.enableLights(true); //是否在桌面icon右上角展示小红点
            channel.setLightColor(Color.GREEN); //小红点颜色
            channel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
            mNotificationManager.createNotificationChannel(channel);//创建Channel
            mIntent=new Intent();
            mIntent.setClass(activity,SecondActivity.class);
        }

        @TargetApi(Build.VERSION_CODES.O)
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public void handleMessage(Message msg) {
            Activity activity=mActivity.get();
            if(activity==null){
                throw new NullPointerException("activity 为空");
            }else if(msg.what==MESSAGE_ADD){
                Notification.Builder builder=new Notification.Builder(activity);
                PendingIntent intent=PendingIntent.getActivity(activity,0,mIntent,0);

                builder.setContentTitle("测试  "+mNotificationId) //必须提供
                        .setContentText("测试内容") //必须提供
                        .setTicker("测试通知到达")
                        .setWhen(System.currentTimeMillis())
                        .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
                        .setSmallIcon(R.mipmap.ic_launcher_round) //必须提供
                        .setOngoing(true)           //  设置常驻用户无法清除
                        .setContentIntent(intent)   //用于点击通知跳转界面
                        .setChannelId(CHANNEL_ID); //Android O以上版本必须提供

                mNotificationManager.notify(mNotificationId++, builder.build());
            }else if(msg.what==MESSAGE_CLEAR){
                mNotificationManager.cancelAll();
            }else if(msg.what==MESSAGE_DELETE_BY_ID){
                if(mNotificationId>0){
                    mNotificationManager.cancel(mNotificationId-1);
                    mNotificationId--;
                }else{
                    Toast.makeText(activity, "已经没有通知需要清除了", Toast.LENGTH_SHORT).show();
                }
            }else if(msg.what==MESSAGE_ADD_SP){

                Notification.Builder builder=new Notification.Builder(activity);
                Intent in=new Intent("close");
                in.setPackage(activity.getPackageName());
                PendingIntent intent=PendingIntent.getBroadcast(activity,0
                        ,in,PendingIntent.FLAG_UPDATE_CURRENT);

                MyNotificationView myNotificationView=new MyNotificationView(activity.getPackageName()
                        ,R.layout.notification_item
                        ,activity);
                myNotificationView.setOnClickPendingIntent(R.id.btn_item_close,intent);

                builder.setSmallIcon(R.mipmap.ic_launcher)
                        .setOngoing(false)
                        .setAutoCancel(true)
                        .setCustomContentView(myNotificationView)
                        .setChannelId(CHANNEL_ID)
                        .setWhen(SystemClock.currentThreadTimeMillis())
                        .setContentIntent(intent);
                mNotificationManager.notify(mNotificationId++, builder.build());

            }else if(msg.what==MESSAGE_CLOSE){
                Toast.makeText(activity,"关闭成功",Toast.LENGTH_SHORT).show();
            }

            super.handleMessage(msg);
        }
    }

项目地址:https://github.com/1104219446/NitificationTest.git

 

标签:8.1,mNotificationManager,广播,intent,activity,msg,new,Android,com
来源: https://blog.csdn.net/Swust_Zeng_zhuo_K/article/details/96474461

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有