У меня есть приложение Android Wear (WearOS), которое после запуска в течение периода времени очень длинный (скажем, 1 час плюс) иногда теряет свое состояние.
Под потерей своего состояния я подразумеваю, что после долгой работы приложение возобновляет работу в «состоянии А» из своего уведомления.
Однако, если приложение работает, скажем, 20 минут, оно правильно возобновляет работу в «состоянии B» из своего уведомления.
Мой класс обслуживания:
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = this.createNotification();
super.startForeground(PID, notification);
return START_STICKY;
}
private Notification createNotification(){
Log.i("MyService", "createNotification");
Intent mainIntent = new Intent(this, MyActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0, mainIntent,0);
// shortened for breviety ... creates notification ...
return notification;
}
Мой класс активности:
private void startWatching() {
if (this.intentService != null){
this.stopGpsAndCloseDb();
}
this.intentService = new Intent(this, MyService.class);
this.intentService.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
super.startService(intentService);
}
Может ли кто-нибудь пролить свет на эту проблему, что мне не хватает? Спасибо!
Приложение нигде не сохраняет свое состояние, нужно ли? Я думал, что Android автоматически управляет состоянием приложения. Кроме того, трудно сказать, что происходит даже при использовании logcat, потому что, как я уже упоминал, проблема возникает только с иногда, и ее действительно трудно воспроизвести. Спасибо!
Если у вашего приложения есть состояние, на которое оно полагается, оно отвечает за его хранение / загрузку - ОС этого не делает. Перечитывая свой вопрос ... вы говорите, что иногда, когда ОС убивает ваш процесс, она не перезапускает вашу службу?
Дополнение: для начала я бы добавил методы-заглушки с журналированием для всех событий жизненного цикла Service, чтобы понять, что происходит с является, когда это происходит.
Привет @String, я думаю, ты справился! Я считаю, что «Активность» убивают, а «Служба» продолжает работать. Это означает, что когда я нажимаю на уведомление, чтобы восстановить «Активность», оно восстанавливает его в исходное состояние. Не могли бы вы привести пример того, как я «сохраню» состояние приложения в «Службе», чтобы «Действие» вернулось в правильное состояние? Большое спасибо!
После дальнейшего расследования, очевидно, все, что мне нужно было сделать, это установить для всех моих Намерения значение SingleTop и добавить singleTop к основнойМероприятия в AndroidManifest.xml. Кроме того, необходимо установить правильные НамерениеДействие и Категория на Услуга - есть ли что-нибудь еще? Я собираюсь попробовать. Источник: stackoverflow.com/questions/5502427/… - [Некоторые исследования launchModes: stackoverflow.com/questions/25773928/…]




В моем случае, следующее ниже помогло (протестировано / уже в производстве).
Активность - SINGLE_TOP:
this.intentService = new Intent(this, MyService.class);
this.intentService.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Сервис - START_STICKY & SINGLE_TOP & Action & Category:
Intent mainIntent = new Intent(this, MyActivity.class);
mainIntent.setAction(Intent.ACTION_MAIN);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mainIntent, 0);
AndroidManifest.xml - launchMode = "singleTop":
<activity
android:name = ".MyActivity"
android:label = "@string/app_name"
android:launchMode = "singleTop">
Я хотел бы поблагодарить @String за то, что указал мне в правильном направлении.
Где хранится состояние? И что вы получите от logcat в каждой из этих ситуаций?