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


Обновление идет правильно, но проблема в том, что оно не открывает само приложение после обновления, даже если я установил 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);
}
}


И это записано в моем манифесте:



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


Он фактически открывает телефонную службу. Поэтому я думаю, что проблема заключается в жизненном цикле обновления, так как приложение не готово, когда действие трансляции рождается.



Более того, я сделал еще одну попытку и создал боковое приложение, которое ничего не делает, кроме вызова действия трансляции в мое основное приложение, поэтому я могу вызвать это боковое приложение, и с помощью этого "двойного шага" оно может фактически повторно открыть только что обновленное приложение. Проблема в том, что мне нужно установить два приложения = /

Кто-нибудь может мне помочь? Есть ли способ повторно открыть только что обновленное приложение?

483   1  

1 ответ:

Начиная примерно с 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().

Comments

    Ничего не найдено.