android8显示广播,Android 8.1版本广播发送问题

本文详细介绍了在Android O及以上版本中,由于系统对后台进程和隐式广播的限制,如何调整广播接收器的注册方式。推荐使用动态注册Receiver,并提供了示例代码,包括使用隐式广播的替代方案。同时,针对系统广播在Android 8.0上的限制,给出了降低targetSdkVersion的解决方法。此外,还展示了具体的BroadcastReceiver和Handler的交互代码,用于处理通知栏的点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

89a308a13d9ec6bc3ef2dcd0f6cc1d49.png

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

1c0426176842ef9c99ec3225cbde832b.png

查资料后发现,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

e4d1ab07783b0ade8cb828e334292b8c.png

b63d129503e1c6a93bc65098dd93088d.png

广播代码

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 WeakReferencemActivity;

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.youkuaiyun.com/Swust_Zeng_zhuo_K/article/details/96474461

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值