解决Android通知栏遇到的坑:动态注册广播无法触发点击事件

通过点击通知栏发送广播有个坑:动态注册广播无法触发点击事件,其实是可以解决的。

代码示例:

//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)广播改为静态注册

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章