Android应用程序更新问题

时间:2013-07-23 23:45:20

标签: android android-intent android-activity intentfilter

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

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

  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 app并使用“Done”/“Open”按钮从Activity启动应用程序(API&lt; 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);
    

1 个答案:

答案 0 :(得分:0)

首先,在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);