繁体   English   中英

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

[英]Dynamic register to broadcast receiver not working

当我将广播接收器设置为匿名类时,他从未调用,但是当我将其设置为类并在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项目jar。

我在清单上设置此权限:

<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);

接收器工作正常并在屏幕打开时被呼叫

它们是两种动作吗:1)需要在清单中声明2)不需要在清单中声明

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

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");

由于您的AndroidManifest文件中有<data android:scheme="package"/> 您也应该以编程方式使用它。 否则它将无法正常工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM