デバイス所有者として実行されるアプリを開発しており、その中に自動アップデーターを構築したいと考えています。
これを行うには、デバイス所有者の立場から PackageInstaller を使用する権限があるため、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();
}
LauncherReceiver.START_INTENT
更新はうまくいきますが、問題は、アクションを新しいアプリ インスタンスにブロードキャストするように IntentSender を設定した場合でも、更新後にアプリ自体を再度開かないことです (開始します)。
ここに私のレシーバーがあります:
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);
}
}
そして、それは私のマニフェストに登録されています:
<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
したがって、レシーバーは機能しますが、何らかの理由でパッケージ インストーラー セッション コミットからは機能しません。アップグレードによりアプリは自動的に閉じますが、再び開くことはありません。
をこれに変更する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();
}
実際に電話サービスを開きます。したがって、ブロードキャスト アクションが生成されたときにアプリの準備ができていないため、問題はアップグレード ライフサイクルにあると思います。
さらに、もう一度試してみて、ブロードキャスト アクションをメイン アプリに呼び出すだけのサイド アプリを作成したので、このサイド アプリを呼び出すことができ、この「ダブル ステップ」で、更新されたばかりのアプリを実際に再度開くことができます。問題は、2 つのアプリをインストールする必要があることです =/
誰でも私を助けることができますか?更新したばかりのアプリを再度開く方法はありますか?