如何以编程方式使用BroadCastReceiver

时间:2014-10-19 19:16:43

标签: android broadcastreceiver

如何注册侦听" PACKAGE_ADDED"的BroadcastReceiver?动作以编程方式?我正在尝试在安装软件包后执行某些操作。我可以通过在AndroidManifest.xml中注册接收器来实现它,但是我需要通过以编程方式注册它来使其工作,以便只通过我的应用程序安装.apks来调用它。我已经尝试了几种不同的方法,下面的代码来自这个答案https://stackoverflow.com/a/4805733/1024722,但它不起作用。有什么想法吗?

private BroadcastReceiver receiver;

protected void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        ButterKnife.inject(this);


        intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.v("test", "received");
            }
        };

        registerReceiver(receiver, intentFilter);   

}

编辑:在我的应用程序活动中,我单击一个按钮从服务器下载应用程序,然后安装它我在通知栏中单击下载的应用程序。然后它出现在这个屏幕上:

enter image description here

我点击"安装"并且它安装但没有调用我的onReceive方法(除非我在xml中注册它)。然后它显示这个屏幕:

enter image description here

然后我点击"完成"并使用" install"返回到我的活动按钮。我想知道它是否无法正常工作,因为它启动了屏幕截图中显示的活动,因此无法在我的接收器中调用onReceive方法,因为我的活动的onPause方法已被调用且不是&#39 ; t"活跃"直到我点击完成,这是在" PACKAGE_ADDED"之后行动被召唤。

2 个答案:

答案 0 :(得分:2)

您需要添加http://developer.android.com/reference/android/content/IntentFilter.html#addDataScheme(java.lang.String)

|intent filter object|.addDataScheme("package");

PackageManager只会将其发送给具有该意图行为 AND 数据方案为'package'的接收者。

答案 1 :(得分:-1)

听起来您想要控制清单中发布的组件是否处于活动状态,而不是在运行时动态注册接收器(通过Context.registerReceiver())。

如果是这样,您可以使用PackageManager.setComponentEnabledSetting()来控制这些组件是否处于活动状态:

http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName,int,int)

请注意,如果您只对在运行时接收广播感兴趣,最好使用registerReceiver()。当您需要确保每次发送广播时都启动应用程序时,接收器组件非常有用。