【发布时间】:2011-04-11 16:30:31
【问题描述】:
我尝试使用此 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";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "in OnNetworkChanged");
}
}
我昨天也从 Activity 内部调用了该方法。我认为它有效,但今天没有任何效果了。 难道是我昨天误解为禁用接收器的意图(android.net.conn.CONNECTIVITY_CHANGE)有时会出现很大延迟?
PackageManager 的方法是正确的方向还是这个想法存在基本错误?
非常感谢, 斯文
【问题讨论】:
-
顺便说一下@Sven,你最初的错误是一个很常见的错误。您需要的 ComponentName ("com.app", "com.app.broadcast_receivers.OnNetworkChangedReceiver");我意识到这个解决方案看起来很奇怪,因为包名似乎被列出了两次。而且由于“新 Android 向导...”在您第一次创建项目时可能只要求您提供一个包名称,因此很容易认为只有一个,但实际上它会获取您提供的字符串并分配到两个不同的包名,应用程序包名和活动包名。
-
使用
0而不是PackageManager.DONT_KILL_APP也可以帮助您摆脱活动,如果我正确阅读文档:developer.android.com/reference/android/content/pm/…在SetComponentEnabledSetting部分。