Android应用程序更新问题

最近我一直在面对我的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个button“完成”,“打开”。 我写了“理论上”,因为到目前为止,我遇到了以下情况:

  1. 应用程序已安装,显示消息“应用程序已安装”的活动显示,用户单击“打开”,但没有任何反应(Android 2.3。*)或应用程序确实打开自己 – 这种行为是随机的。

  2. 应用程序已安装,消息“应用程序已安装”的活动显示,但突然消失。

试图绕过这个错误(?)我发现http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACED 。 我实施的BroadcastReceiver,开始启动活动,让我们说这是一个合适的解决scheme。

  <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> 

这个解决scheme不得不被修改,因为具有较低API(低于12)的应用程序不能处理ACTION_MY_PACKAGE_REPLACED,所以我实现了API依赖的行为:

  • 允许正常安装udpate应用程序,并通过“完成”/“打开”button(API <12)从Activity启动应用程序

  • 在ACTION_MY_PACKAGE_REPLACED注意之后,通过MyReceiver启动更新应用程序。

这是我目前的解决scheme。

我的问题是:

  • 为什么更新后的应用程序在安装后在API低于12的Android中单击“打开”后会随机打开?

  • 为什么使用“完成”/“打开”button的活动在具有更高API的设备上消失?

我试图在安装前完成应用,但没有帮助。

我的解释是,在安装过程之后,一个新的软件包必须覆盖旧的软件包,所以旧的软件包必须被简单地删除,这是导致启动活动消失的主要原因。

正如我写的,这是我目前的解决scheme,我不满意。 如果有人能澄清这个问题,我将非常感激。

谢谢阅读。

编辑:

好的,解决scheme非常简单:要成功更新,需要将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); 

Solutions Collecting From Web of "Android应用程序更新问题"

首先,在Manifest中添加“intent-filter”,如下所示:

 `<activity android:name="com.package.MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="file" /> <data android:mimeType="application/vnd.android.package-archive" /> </intent-filter> </activity>` 

然后,设置您的意图标志为新的任务:

intentAPK.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);