我嘗試使用此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可以提供更大的靈活性,并且通常更易于管理。

米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
某些類型的廣播(例如BOOT_COMPLETED
)無法通過進行有效注冊registerReceiver()
。而且,過度依賴registerReceiver()
會導致您獲得永久服務-僅用于維護接收方的服務-這很糟糕。禁用組件是提高效率的一個好主意,尤其是對于流行的系統廣播(例如)BOOT_COMPLETED
。
- 3 回答
- 0 關注
- 650 瀏覽
添加回答
舉報
0/150
提交
取消