我正在尝试编写类似于自定义应用商店的内容,但我很难听到安装的结果。
我尝试了很多东西,但没有一个能发挥应有的作用。
在我的主要活动类中,我的安装代码如下:
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 问题,但似乎都没有我正在寻找的答案。