如何在Android程序安装上避免多个apk安装提示?

时间:2015-06-01 10:15:57

标签: android android-intent apk

我们的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 OS应用程序安装提示)安装或取消应用程序apk。

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

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

示例1:只有应用程序X获得更新,用户将其保留15分钟,并且只显示应用程序X的一个安装提示。

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

然后我们的自定义活动执行后台服务过去做的事情:

/**
 * 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();
    }

}