最近我一直面临着我的android应用程序更新过程的问题。
简而言之,应用程序能够检查是否在服务器上上传了更高版本代码的更新。如果是,用户决定是否更新。加载该应用程序并开始标准安装后:
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
startActivity(intent)
问题是,当 android Intent 完成安装时,“理论上”活动信息“应用程序已安装”和 2 个按钮“完成”、“打开”。我写“理论上”是因为到目前为止我遇到了以下情况:
应用程序已安装,显示“应用程序已安装”消息的活动,用户单击“打开”但没有任何反应(Android 2.3.*)或应用程序确实正确打开 - 这种行为是随机的。
应用程序已安装,显示“应用程序已安装”消息的活动但突然消失。
试图规避这个错误(?)我发现http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED。我实现的 BroadcastReceiver 启动了 Launch Activity,让我们说这是一个适当的解决方案。
<receiver android:name=\".MyReceiver\" >
<intent-filter>
<action android:name="android.intent.action.ACTION_PACKAGE_REPLACED" />
//Or from API 12 <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
必须修改此解决方案,因为具有较低 API(低于 12)的应用程序无法处理 ACTION_MY_PACKAGE_REPLACED 所以我实现了依赖于 API 的行为:
允许正常安装 udpate 应用程序并使用“完成”/“打开”按钮从 Activity 启动应用程序(API < 12)
在 ACTION_MY_PACKAGE_REPLACED 注释后通过 MyReceiver 启动更新应用程序。
这是我目前的解决方案。
我的问题是:
为什么在API低于12的android中安装后单击“打开”后更新的应用程序会随机打开?
为什么带有“完成”/“打开”按钮的活动在具有更高 API 的设备上消失?
我试图在安装之前完成应用程序,但它没有帮助。
我的解释是,在安装过程之后,新包必须覆盖旧包,因此必须简单地删除旧包,这是启动活动消失的主要原因。
正如我所写,这是我目前的解决方案,我并不满意。如果有人能澄清此事,我将不胜感激。
谢谢阅读。
编辑:
好的,解决方案很简单:要成功更新,您需要将 Intent 作为新任务启动(arrrgh ...):
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);