Android:带dataScheme的IntentFilter如何匹配无数据Intent并监听两类广播
解决方案
要同时监听带package scheme的应用包变化广播,以及无数据的壁纸变更广播,你需要为同一个广播接收器注册两个独立的IntentFilter——因为单个IntentFilter的scheme规则会作用于所有添加的Action,无法同时兼容有scheme和无scheme的Intent匹配。
修改后的注册代码
actionReceiver = new ActionReceiver(); // 第一个IntentFilter:处理应用包变化广播(带package scheme) IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); packageFilter.addDataScheme("package"); ContextCompat.registerReceiver(this, actionReceiver, packageFilter, ContextCompat.RECEIVER_EXPORTED); // 第二个IntentFilter:处理壁纸变更广播(无scheme) IntentFilter wallpaperFilter = new IntentFilter(); wallpaperFilter.addAction(Intent.ACTION_WALLPAPER_CHANGED); ContextCompat.registerReceiver(this, actionReceiver, wallpaperFilter, ContextCompat.RECEIVER_EXPORTED);
原理说明
- 第一个
packageFilter专门匹配携带packagescheme的ACTION_PACKAGE_ADDED/ACTION_PACKAGE_REMOVED广播,符合系统对这类广播的Intent数据要求。 - 第二个
wallpaperFilter仅配置ACTION_WALLPAPER_CHANGED,不设置任何scheme,因此只会匹配无数据的壁纸变更Intent。 - 同一个
actionReceiver会收到两类Filter匹配到的广播,你只需在Receiver的onReceive方法中通过intent.getAction()区分处理即可。
内容的提问来源于stack exchange,提问作者HelpIDontUnderstandComputers
相关产品推荐
相关产品推荐

