为了账号安全,请及时绑定邮箱和手机立即绑定

启用和禁用广播接收器

启用和禁用广播接收器

沧海一幻觉 2019-10-16 14:54:56
我尝试使用此PackageManager方法启用和禁用广播接收器:setComponentEnabledSetting(componentName,        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,        PackageManager.DONT_KILL_APP);广播接收器已注册在清单中。接收器工作正常,但是当我尝试禁用它时,它仍然会接收广播消息。当我通过“ android:enabled =“ false”“禁用清单中的接收器时,接收器未收到任何内容,但我无法启用它。我从服务内部调用该方法。    PackageManager pm  = getApplicationContext().getPackageManager();    ComponentName componentName = new ComponentName("com.app",             ".broadcast_receivers.OnNetworkChangedReceiver");    pm.setComponentEnabledSetting(componentName,            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,            PackageManager.DONT_KILL_APP);Android清单:    <receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver"                android:enabled="true">            <intent-filter>                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>            </intent-filter>    </receiver>收件人public class OnNetworkChangedReceiver extends BroadcastReceiver {private static final String TAG = "OnNetworkChangedReceiver";@Overridepublic void onReceive(Context context, Intent intent) {    Log.d(TAG, "in OnNetworkChanged");    }}我昨天也从一个Activity内部调用了该方法。我以为它有用,但是今天什么也没有了。可能是我昨天误解为禁用接收器的意图(android.net.conn.CONNECTIVITY_CHANGE)有时会有很大的延迟吗?PackageManager的方法是正确的方向还是该想法存在基本错误?非常感谢,Sven
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

我认为使用PackageManager会过度考虑您的情况。您有一个BroadcastReceiver,有时需要忽略它正在收听的广播。我可以想到两种简单的方法:


1)设置一个标志,您的接收者可以检查该标志以忽略或接受广播,而不必担心完全启用/禁用它。


2)以编程方式(甚至可以是一个内部类)创建BroadcastReceiver,并在应用程序的给定部分根据需要注册和注销它。


总的来说,我发现用代码而不是XML定义我的BroadcastReceivers可以提供更大的灵活性,并且通常更易于管理。


查看完整回答
反对 回复 2019-10-16
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

某些类型的广播(例如BOOT_COMPLETED)无法通过进行有效注册registerReceiver()。而且,过度依赖registerReceiver()会导致您获得永久服务-仅用于维护接收方的服务-这很糟糕。禁用组件是提高效率的一个好主意,尤其是对于流行的系统广播(例如)BOOT_COMPLETED

查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 578 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信