gpt4 book ai didi

Android PackageInstaller,更新后重新打开应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:02 29 4
gpt4 key购买 nike

我正在开发一个以设备所有者身份运行的应用程序,我想在其中构建一个自动更新程序。

为此,我使用了 PackageInstaller,因为我的设备所有者职位使我有权使用它。

private void installPackage(InputStream inputStream)
throws IOException {
notifyLog("Inizio aggiornamento...");
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
int sessionId = packageInstaller.createSession(new PackageInstaller
.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
PackageInstaller.Session session = packageInstaller.openSession(sessionId);

long sizeBytes = 0;

OutputStream out = null;
out = session.openWrite("my_app_session", 0, sizeBytes);

int total = 0;
byte[] buffer = new byte[65536];
int c;
while ((c = inputStream.read(buffer)) != -1) {
total += c;
out.write(buffer, 0, c);
}
session.fsync(out);
inputStream.close();
out.close();

session.commit(createIntentSender(sessionId));
}

private IntentSender createIntentSender(int sessionId) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
sessionId,
new Intent(LauncherReceiver.START_INTENT),
0);
return pendingIntent.getIntentSender();
}

更新正常,但问题是更新后它不会重新打开应用程序本身,即使我设置 IntentSender 将操作 LauncherReceiver.START_INTENT 广播到新的应用程序实例(将启动它)。

这是我的接收器:

public class LauncherReceiver extends BroadcastReceiver {

public static final String START_INTENT = "com.aaa.aaa.action.START";

@Override
public void onReceive(Context context, Intent intent) {
System.out.println("CALL RECEIVER!!");
Intent startIntent = new Intent(context, StartActivity.class);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(startIntent);
}
}

它已在我的 list 中注册:

    <receiver android:name=".receivers.LauncherReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.aaa.aaa.action.START"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

如果我通过 CLI 调用它,它会起作用:

am broadcast -a com.worldnet.gestitruck.action.START 

所以接收器可以工作,但由于某些原因,它在包安装程序 session 提交时不起作用。该应用程序因升级而自行关闭,但不会再次打开。

如果我将 createIntentSender 更改为:

private IntentSender createIntentSender(int sessionId) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0123456789"));
PendingIntent pendingIntent = PendingIntent.getActivity(context,sessionId,intent,0);
return pendingIntent.getIntentSender();
}

它实际上打开了电话服务。所以我认为问题在于升级生命周期,因为在生成广播操作时应用程序尚未准备好。

此外,我又做了一次尝试,我创建了一个副应用程序,它除了调用主应用程序的广播操作外什么都不做,所以我可以调用这个副应用程序,通过这个“双步”,它实际上可以重新打开刚刚更新的应用程序。问题是我必须安装两个应用程序 =/

有人能帮帮我吗?有没有办法重新打开刚刚更新的应用程序?

最佳答案

大约从Android 5开始(我不知道确切的API级别),Android会发送一个广播Intent使用 ACTION= "android.intent.action.MY_PACKAGE_REPLACED"在您的应用程序更新后。只需添加

        <intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>

到您的<receiver>声明,您应该能够收听此消息并在 onReceive() 中重新启动您的应用程序.

关于Android PackageInstaller,更新后重新打开应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940990/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com