我正在尝试编写类似于自定义应用商店的内容,而且我很难听到安装结果。
我尝试了各种各样的东西,但它们都没有按照它们应有的功能运行。
在我的主要活动类中,我的安装代码如下:
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问题,但似乎没有一个我正在寻找的答案。
答案 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...