我的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,是因为升级之后我想要“打开”& “完成”选项,如果我不使用此标志,则不会显示。
当上面的代码启动软件包安装程序时,它有两个选项OK&取消,当用户按取消时,我想知道用户取消了它。但我无法知道因为onActivityResult被称为pre-maturely。我在阅读以下帖子之后就明白了为什么会这样。
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,否则我将无法在成功升级时获得“打开”和“完成”选项。
有人遇到过类似的问题吗?请帮助我,因为它让我疯了。
答案 0 :(得分:3)
您应该使用包添加的广播意图。创建广播接收器监听package added. 如果添加的包等于您的包,则用户确认安装否则解除安装过程。如果你问android可以返回什么样的额外内容,android会返回关于包的EXTRA_UID。 PackageManager的方法将uid转换为package。(getPackagesForUid(int uid)返回String数组,但它通常返回数组中的一个项目,通常是数组长度等于1。