动态注册到广播接收器不工作

时间:2013-12-30 17:34:20

标签: android broadcastreceiver

当我将我的广播接收器设置为匿名课程时,他从未打过电话 但是当我将它设置为类并在android上声明它时,它的工作正常

我希望能够动态注册和取消注册广播接收器 为什么它不会工作

这是我的代码:

public class AppChangedProbe extends Probe.Base implements Probe.ContinuousProbe{

private BroadcastReceiver appReceiver;


@Override
protected void onEnable() {

    IntentFilter filter = new IntentFilter();


    filter.addAction(Intent.ACTION_PACKAGE_ADDED);
    filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    filter.addAction(Intent.ACTION_PACKAGE_CHANGED);


    appReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED))
                Logger.i(getClass(), "App Removed");

            if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED))
                Logger.i(getClass(),"App Updated");

            if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED))
                Logger.i(getClass(),"App Added");
        }
    };

    getContext().registerReceiver(appReceiver, filter);
}

@Override
protected void onDisable() {
    getContext().unregisterReceiver(appReceiver);
}

@Override
protected boolean isWakeLockedWhileRunning() {
    return false;
}

}

Probe.Base和Probe.ContinuousProbe是FUNF项目罐。

我在清单上设置了这个权限:

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />

当我使用广播接收器作为其工作类时

这是有效的代码:

public class AppChangedReceiver extends BroadcastReceiver {

@Override
   public void onReceive(Context context, Intent intent) {


    if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED))
        Logger.i(getClass(),"App Removed");

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED))
        Logger.i(getClass(),"App Updated");

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED))
        Logger.i(getClass(),"App Added");

}

}

并在清单中:

<receiver android:name =".sensors.EventBaseProbes.AppChangedReceiver">
        <intent-filter android:priority="100">
            <action android:name="android.intent.action.PACKAGE_REMOVED"/>
            <action android:name="android.intent.action.PACKAGE_CHANGED"/>
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <data android:scheme="package"/>
        </intent-filter>

发生的事情是,当我使用其他行动时,它会以两种方式工作。

例如,如果我将示例中的过滤器替换为此过滤器

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);

接收器工作正常并在屏幕开启时调用

他们是2种行动:  1)需要在清单上声明  2)不需要在清单上声明

1 个答案:

答案 0 :(得分:4)

我最近一直在处理同样的问题。这是你应该怎么做。

IntentFilter filter = new IntentFilter();

filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");

由于<data android:scheme="package"/>文件中包含AndroidManifest。你也应该以编程方式使用它。否则它就不会起作用。

最后,您不必添加任何权限。这些广播不需要许可。