我正在尝试对我正在编写的应用程序进行程序化更新,因为它不是Google Play应用程序,我想提供一种更新方式。
我一直在寻找如何在下载APK以获取更新后启动Android安装程序,但我需要从安装程序获取结果,告诉我更新是否成功,或者是否它已被用户取消。
我在StackOverflow上看到了很多关于此的问题,答案通常涉及使用广播接收器。问题在于它只能接收有关正在安装的软件包的意图,而不是关于取消的安装失败。
我做了一些更多的研究,似乎Intent API提供了一些额外的东西,比如Intent.EXTRA_RETURN_RESULT,如果设置为true,则应该返回安装程序活动的结果 - 我想通过onActivityResult。不幸的是,这不起作用。有没有人让这个工作/它是这样工作吗?
以下是准备安装程序活动开始的代码,我目前有:
Intent installApp = new Intent(Intent.ACTION_INSTALL_PACKAGE);
installApp.setData(downloadedApk);
installApp.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
installApp.putExtra(Intent.EXTRA_RETURN_RESULT, true);
installApp.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, context.getApplicationInfo().packageName);
context.startActivityForResult(installApp, 1);
答案 0 :(得分:3)
你使用片段吗? onActivityResult将从您调用startActivity(...)的Activity或Fragment中调用。片段#startActivity(...)确实存在。用它来调用Fragment的onActivityResult(...)。 如果您不使用碎片,此解决方法将起作用。
解决方法伪代码
// CURRENT_VERSION is a const with the current APK version as int
Activity#onStart() {
super.onStart();
checkForUpdaterResult();
/*...*/
}
Activity#checkForUpdaterResult() {
final int updateVersion = preferences.getInt(UPDATE_VERSION, -1);
switch(updateVersion) {
case -1:break;
default:
// updateVersion = oldVersion is smaller than the new currentVersion
boolean success = updateVersion < CURRENT_VERSION;
onUpdaterPerformed(success, updateVersion , CURRENT_VERSION);
break;
}
}
Activity#startUpdate(File pAPK) {
perferences.putInt(UPDATE_VERSION, CURRENT_VERSION);
/*...*/
}
Activity#onUpdaterPerformed(boolean pSuccess, int pFromVersion, int pToVersion) {
Toast.show("Update success: " + pSuccess);
/* e.g. migrate DB */
/*...*/
}