0

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

我尝试了很多东西,但没有一个能发挥应有的作用。

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

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 问题,但似乎都没有我正在寻找的答案。

4

1 回答 1

3

如果您myReceiver在其中注册onResume()和注销它,onPause()它将永远不会被调用,因为当安装包时您的应用程序会暂停。

您需要注册MyReceiveronCreate()直到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...
于 2012-08-22T17:56:22.363 回答