如何将BroadcastReceiver中的信息传递给Android中的Activity

时间:2012-08-21 20:53:48

标签: android android-intent

我正在尝试编写类似于自定义应用商店的内容,而且我很难听到安装结果。

我尝试了各种各样的东西,但它们都没有按照它们应有的功能运行。

在我的主要活动类中,我的安装代码如下:

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(Uri.fromFile(apkFile),
"application/vnd.android.package-archive");
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getApplicationInfo().packageName);
startActivityForResult(intent, resultIndex);

这非常简单。我尝试获得结果的第一件事是覆盖主活动中的onActivityResult函数。该函数永远不会被调用(第一行的记录器语句永远不会打印)。

因此,我尝试在清单中创建一个接收器。

<receiver android:name=".PackageReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

然后在PackageReceiver类中,我重写了onReceive函数。这是因为PackageReceiver的函数确实被调用了,但是现在我遇到了如何通知主要活动发生了什么事情的问题(出于我的项目的目的,我需要知道)。我无法实例化PackageReciever; Android为我做了这个,因为它在清单中。

我尝试创建一个新的广播,所以我的PackageReceiver的onReceive函数如下所示:

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equals(Intent.ACTION_INSTALL_PACKAGE) ||
            action.equals(Intent.ACTION_PACKAGE_ADDED) ||
            action.equals(Intent.ACTION_PACKAGE_CHANGED) ){
        logger.debug("Caught action of type " + action);

        Intent i2 = new Intent();
        i2.setAction("MY.CUSTOM.ACTION");
        context.sendBroadcast(i2);
    }

}

然后,在我的主要活动中,我创建了一个新的BroadcastReceiver:

BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        logger.warn("I made it!!!! HOORAY!!");
    }
};

并在onResume中注册了该接收者(并在onPause中未注册)功能,如下所示:

@Override
protected void onResume() {
    IntentFilter filter = new IntentFilter();
    filter.addAction("MY.CUSTOM.ACTION");
    registerReceiver(myReceiver, filter);
    logger.debug("Registering receiver in onResume.");
    super.onResume();
}

这听起来像是一个不错的解决方案,但“myReceiver”从未调用过onRecieve函数。我已经尝试通过简单地删除取消注册,将注册移动到活动的onCreate方法,确保我不会取消注册,而这些都不起作用。最终的结果就是在记录器中抛出异常,说我泄漏了一个IntentFilter,“你忘了注销了吗?” (不,我非常有目的地没有注销......但是......没关系)。

关于如何弥合这一差距我的想法已经不多了。此外,我不能只是轮询已安装的应用程序并检查版本号。由于我无法进入这里的原因,我们不使用版本号。我需要知道用户是否完成了我开始的安装。

如何将PackageReceiver中的信息发送到主要活动?或者,如何在主活动本身中捕获安装结果?

感谢所有给它刺痛的人。我检查了其他stackoverflow问题,但似乎没有一个我正在寻找的答案。

1 个答案:

答案 0 :(得分:3)

如果您在myReceiver注册onResume()并在onPause()取消注册,则永远不会被调用,因为在安装软件包时,您的应用会暂停。

您需要在MyReceiver注册onCreate(),并且在onDestroy()之前不要取消注册。

此外,您不需要这么多组件来执行此操作。在您的主要活动中,在您开始安装软件包之前,您可以注册接收器以监听软件包安装程序结果:

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addDataScheme("package"); 
registerReceiver(myReceiver, filter);

// Now launch the package installer...