【问题标题】:How do I avoid multiple apk install promps on an Android programmatic install?如何避免在 Android 编程安装中出现多个 apk 安装提示?
【发布时间】:2015-06-01 10:15:56
【问题描述】:

我们的 Android 应用程序每 5 分钟在后台自动检查一次更新,并从我们的下载服务器下载最新的 .apk 文件。

然后它使用以下方法启动安装:

public static void installDownloadedApplication(Context context) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    File sdcard = Environment.getExternalStorageDirectory();
    File file = new File(sdcard, Constants.APPLICATION_CODE+".apk");
    Uri uri = Uri.fromFile(file);
    intent.setDataAndType(uri, "application/vnd.android.package-archive");
    context.startActivity(intent);
}

这会提示最终用户(使用标准的 Android 操作系统应用程序安装提示)安装或取消应用程序 apk。

如果我们只有一个应用程序需要更新,那么无论该应用程序中的上述代码运行多少次,Android 安装提示都只会出现一次。

我们遇到的问题是,如果用户长时间离开他的 Android 设备并且他的多个应用程序需要同时自动更新,则此代码每 5 分钟为每个应用程序运行一次,但现在多个 Android第二个尝试安装的应用程序会出现安装提示。

示例 1:只有应用程序 X 获得更新,用户离开它 15 分钟,只出现一个应用程序 X 的安装提示。

示例 2:应用程序 X 和 Y 都获得更新,用户离开 15 分钟,应用程序 X 出现 1 个安装提示,但应用程序 Y 出现 3 个安装提示

任何想法可能导致示例 2 中的问题?

谢谢

【问题讨论】:

    标签: android android-intent apk


    【解决方案1】:

    您的服务器会告诉您最新的 APK。将此与您下载区域中的进行比较。如果您已经下载了最新版本,则无需再次下载。

    此外,当您通过 Intent 开始安装时,请记住将版本 ID 和日期/时间写入共享首选项。在 X 小时/天过去之前,请勿尝试再次安装相同的版本。

    【讨论】:

    • 感谢您的回复。不幸的是,我们的服务器只告诉我们应用程序已过时。然后应用程序通过从下载区域下载静态命名的 apk 文件并安装它来响应。如果文件已经存在于设备上,它不会再次下载它,但它会尝试每次重新安装它。这就是问题所在。
    • 好吧,您可能不应该要求用户每 5 分钟安装一次。每天一次应该足够了。我不能提出任何其他建议。对不起。
    • 我已经找到了更多关于此的信息并稍微更新了原始问题
    【解决方案2】:

    通过让我们的后台服务调用自定义活动,我设法让它在没有重复项的情况下正常工作:

    public static void installDownloadedApplication(Context context) {
        Intent intent = new Intent(context, InstallActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    

    然后我们的自定义 Activity 会做后台服务之前做的事情:

    /**
     * We use an activity to kick off the installer activity in order to avoid issues that arise when kicking off the apk installer from a background services
     * for multiple applications at the same time.
     * */
    public class InstallActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            File sdcard = Environment.getExternalStorageDirectory();
            File file = new File(sdcard, Constants.APPLICATION_CODE+".apk");
            Uri uri = Uri.fromFile(file);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            this.startActivity(intent);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            finish();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多