我的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 immediately triggering onActivityResult
onActivityResult() called prematurely
他们要求我确保用于启动活动的Intent上未设置FLAG_ACTIVITY_NEW_TASK。看到这里:
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK
尤其要注意:“当呼叫者处于从正在启动的活动中请求结果。“
如果活动是作为新任务的一部分启动的,则Android将立即使用RESULT_CANCELED调用onActivityResult()因为一项任务中的活动无法将结果返回给另一项任务,只有同一任务中的活动才能这样做。
但是就我而言,我无法删除FLAG_ACTIVITY_NEW_TASK,因为否则,成功升级后,我将不会获得“打开”和“完成”选项。
有人遇到过类似的问题吗?请帮助我,因为它使我发疯。
您应该使用添加了包的广播意图。创建广播接收器监听package added.如果添加的软件包等于您的软件包,则用户确认安装,否则取消安装过程。如果您询问android可以返回哪种附加功能,则android返回有关程序包的EXTRA_UID。 PackageManager的方法将uid转换为package。(getPackagesForUid(int uid)返回String数组,但通常会在短时间内返回数组中的一项,通常数组长度等于1。
我在FLAG_ACTIVITY_NEW_TASK上遇到了同样的问题,请在下面的链接中找到我找到的解决方案。