4

我正在尝试对我正在编写的应用程序进行编程更新,因为它不是 Google Play 应用程序,我想提供一种进行更新的方法。

我一直在四处寻找,发现在下载更新的 APK 后如何启动 Android 安装程序,但我需要从安装程序中获取结果,告诉我更新是否成功,或者是否被取消由用户。

我在 StackOverflow 上看到了很多关于此的问题,而答案通常涉及使用广播接收器。这样做的问题是它只能接收关于正在安装的包的意图,而不是关于取消安装失败的意图。

我做了一些更多的研究,似乎 Intent API 提供了一些额外功能,例如 Intent.EXTRA_RETURN_RESULT,如果设置为 true,则应该返回安装程序活动的结果——我猜是通过 onActivityResult。不幸的是,这不起作用。有没有人让这个工作/它像这样工作?

这是我目前拥有的准备安装程序活动开始的代码:

            Intent installApp = new Intent(Intent.ACTION_INSTALL_PACKAGE);
            installApp.setData(downloadedApk);
            installApp.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
            installApp.putExtra(Intent.EXTRA_RETURN_RESULT, true);
            installApp.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, context.getApplicationInfo().packageName);
            context.startActivityForResult(installApp, 1);
4

1 回答 1

3

你使用片段吗?onActivityResult 将从您调用 startActivity(...) 的 Activity 或 Fragment 中调用。Fragment#startActivity(...) 确实存在。使用它来调用 Fragment 的 onActivityResult(...)。如果您不使用 Fragments,此解决方法将起作用。

解决方法伪代码

// CURRENT_VERSION is a const with the current APK version as int

Activity#onStart() {
  super.onStart();
  checkForUpdaterResult();
  /*...*/
}

Activity#checkForUpdaterResult() {
  final int updateVersion = preferences.getInt(UPDATE_VERSION, -1);
  switch(updateVersion) {
    case -1:break;
    default: 
      // updateVersion = oldVersion is smaller than the new currentVersion
      boolean success = updateVersion < CURRENT_VERSION;
      onUpdaterPerformed(success, updateVersion , CURRENT_VERSION); 
    break;
  }
}

Activity#startUpdate(File pAPK) {
  perferences.putInt(UPDATE_VERSION, CURRENT_VERSION);
  /*...*/
}

Activity#onUpdaterPerformed(boolean pSuccess, int pFromVersion, int pToVersion) {
  Toast.show("Update success: " + pSuccess);
  /* e.g. migrate DB */
  /*...*/
}
于 2013-03-12T17:17:27.490 回答