20

我正在为我的应用程序编写应用程序更新程序。在我确保我的设备上有我的 apk 之后,这就是我在尝试更新的应用程序中所做的事情:

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
File f = new File(apkLocation);    
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");
_context.startActivity(promptInstall);

这会启动我的安装程序,它会显示应用程序权限,我可以单击“安装”。但是从这里应用程序只是关闭,我没有收到任何消息(我希望对话框告诉我安装成功,让我可以选择按“关闭”或“打开”)。它只是进入设备的主屏幕,无需另行通知。

附带说明一下,当我手动打开它时,该应用程序确实已更新。如何使安装程序按预期进行?有什么要设定的意图吗?

在写这篇文章时,我想知道发生这种情况的原因是否是当前应用程序被简单地覆盖在设备上从而关闭它,并且由于它的源被杀死而在某种程度上没有得到意图的结果?

4

3 回答 3

18

您所能做的就是使用意图过滤器注册一个接收器,android.intent.action.PACKAGE_INSTALL或者android.intent.action.PACKAGE_REPLACED您可以从中重新启动您的应用程序。

<receiver android:enabled="true" android:exported="true" android:label="BootService" android:name="com.project.services.BootService">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <data android:scheme="package"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_INSTALL"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_CHANGED"/>
            <data android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED"/>
            <data android:scheme="package"/>
        </intent-filter>
    </receiver>
</application>

public class BootService extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context,Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context, Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    }
  }
}
于 2013-05-15T22:52:54.797 回答
3

要成功更新,您需要启动带有 URI 的意图,将您的更新应用程序指示为新任务。

 final Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
 "application/vnd.android.package-archive");
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);

我的帖子如下:

Android 应用程序更新问题

于 2013-07-25T13:31:03.150 回答
1

首先,你不能在没有提示的情况下安装,除非你是 root 或有系统权限。我认为您不是在问这个问题,但是您的其中一段不清楚。

其次,如果安装正在运行的应用程序的更新版本,您看到的行为是预期的:应用程序被强制关闭并更新。您无法就地更新。您可以检测到安装何时中止,因为调用安装程序的活动将恢复。

为了更新正在运行的应用程序并使其保持运行,您需要一个单独的进程(应用程序)来监控安装并重新启动您的应用程序。

于 2013-05-15T16:12:41.153 回答