【问题标题】:How to use BroadCastReceiver programmatically如何以编程方式使用 BroadCastReceiver
【发布时间】:2014-10-19 19:16:43
【问题描述】:

如何以编程方式注册监听“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);   

}

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

我单击“安装”并安装但不调用我的 onReceive 方法(除非我在 xml 中注册它)。然后它显示这个屏幕:

然后我点击“完成”,它会通过“安装”按钮返回到我的活动。我想知道它是否不起作用,因为它启动了屏幕截图中显示的活动,因此无法在我的接收器中调用 onReceive 方法,因为我的活动的 onPause 方法已被调用并且在我单击完成之前不再“活动” ,这是在调用“PACKAGE_ADDED”操作之后。

【问题讨论】:

  • 代码正确。我正在使用这个并且工作正常。你是怎么测试的?
  • 我运行了我的应用程序,然后用它安装了一个包,我的 onReceive 方法从未被调用过。但是,当我在我的 AndroidManifest 中注册接收器时,它会被调用

标签: android broadcastreceiver


【解决方案1】:

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

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

PackageManager 只会将其发送给具有该意图操作的接收器并且将数据方案作为“包”。

【讨论】:

  • 你是对的。出于某种原因,当我在 xml 中注册它时,我遇到了这种情况,但是当我尝试以编程方式注册它时我没有这样做。谢谢
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多