9

我的 Android 应用程序可以选择升级到较新版本,较新版本的 APK 我将其保留在 sdcard 中的路径下。单击升级选项时,我调用以下方法。

    public static void launchInstaller(Activity act, String apkPath)
    {
       Intent intent = new Intent(Intent.ACTION_VIEW);
       intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       act.startActivityForResult(intent, 0);
    }

我包含 FLAG_ACTIVITY_NEW_TASK 的原因是因为在升级后,我想要“打开”和“完成”选项,如果我不使用此标志,则不会显示这些选项。

当上面的代码启动包安装程序时,它有两个选项确定和取消,当用户按下取消时,我想知道用户取消了它。但我无法知道,因为 onActivityResult 被提前调用。阅读以下帖子后,我想到了发生这种情况的原因。

Android - startActivityForResult 立即触发 onActivityResult

onActivityResult() 过早调用

他们要求我确保我用来启动活动的 Intent 上没有设置 FLAG_ACTIVITY_NEW_TASK。看这里:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

特别注意:“当调用者从正在启动的活动中请求结果时,不能使用此标志。”

如果 Activity 作为新任务的一部分启动,那么 Android 将立即使用 RESULT_CANCELED 调用 onActivityResult(),因为一个任务中的 Activity 不能将结果返回给另一个任务,只有同一任务中的 Activity 可以这样做。

但在我的情况下,我无法删除 FLAG_ACTIVITY_NEW_TASK,因为否则我不会在成功升级时获得“打开”和“完成”选项。

有没有人遇到过类似的问题?请帮助我,因为它让我发疯。

4

1 回答 1

4

您应该使用包添加的广播意图。创建添加的广播接收器监听包。 如果添加的包等于您的包,用户确认安装否则关闭安装过程。如果你问 android 可以返回什么样的 extras,android 会返回关于包的 EXTRA_UID。PackageManager 的方法将 uid 转换为包。(getPackagesForUid(int uid) 返回字符串数组,但它通常返回数组中的一项,简而言之,通常数组长度等于 1。

于 2013-10-02T10:21:17.623 回答