通过点击通知栏发送广播有个坑:动态注册广播无法触发点击事件,其实是可以解决的。
代码示例:
//AndroidManifest清单文件配置
<receiver android:name=".MyReceiver"/>
//点击事件接收的广播
public class MyReceiver extends BroadcastReceiver {
public static final String ACTION_SWITCH_CLICK = "com.example.test.MY_BROADCAST";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_SWITCH_CLICK.equals(action)) {
Toast.makeText(context, "点击事件", Toast.LENGTH_SHORT).show();
}
}
}
...省略RemoteViews创建部分代码
// Intent intent = new Intent("com.example.test.MY_BROADCAST"); // 构造函数1
Intent intent = new Intent(mContext,MyReceiver.class); // 构造函数2
intent.setAction("com.example.test.MY_BROADCAST");
PendingIntent pendingIntent = PendingIntent
.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
如果广播是动态注册,用第一种(action的方式)可以响应通知栏点击事件,用第二种(class的方式)构造函数生成Intent,就无法响应。
如果广播是静态注册,第二种方式才可以响应。
原因:静态注册的广播,PMS在安装应用时注册广播类,Intent显示通过类去寻找目标,则可以找到,而动态注册是隐式广播,Intent再通过显示方式去寻找就会找不到,尽管后面setAction也无效。(由于网上没有找到答案,个人分析的)
综上,解决办法有2个
1)Intent对象用action生成
2)广播改为静态注册