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