Android 8.1版本广播发送问题

今天在写通知栏自定义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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值