Подтвердить что ты не робот

Как обрабатывать код, когда приложение убито путем прокрутки в Android?

Если мое приложение запущено, и я нажимаю кнопку "домой", приложение уходит в фоновом режиме. Теперь, если вы долгое время нажимаете кнопку "домой" и убиваете приложение, вытаскивая его из списка последних приложений, ни одно из событий типа onPause(), onStop() или onDestroy() не вызвано, а процесс прекращается. Поэтому, если я хочу, чтобы мои службы останавливались, убивали уведомления и отменяли регистрацию слушателей, как я могу это сделать? Я прочитал немало статей и блогов, но не получил никакой полезной информации, и я не нашел никакой документации об этом. Любая помощь будет оценена по достоинству. Заранее спасибо.

4b9b3361

Ответ 1

Я просто решил проблему подобного типа.

Вот что вы можете сделать, если его просто остановить службу, когда приложение убито путем прокрутки из списка последних приложений.

Внутри файла манифеста сохраните флаг stopWithTask как true для службы. Как:

<service
    android:name="com.myapp.MyService"
    android:stopWithTask="true" />

Но, как вы говорите, вы хотите отменить регистрацию слушателей и прекратить уведомление и т.д., я бы предложил такой подход:

  • Внутри файла манифеста сохраните флаг stopWithTask как false для службы. Как:

    <service
        android:name="com.myapp.MyService"
        android:stopWithTask="false" />
    
  • Теперь в вашей службе MyService переопределите метод onTaskRemoved. (Это будет запущено, только если для параметра stopWithTask установлено значение false).

    public void onTaskRemoved(Intent rootIntent) {
    
        //unregister listeners
        //do any other cleanup if required
    
        //stop service
        stopSelf();  
    }
    

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

Надеюсь, что это поможет.

Ответ 2

Нашел один способ сделать это

сделать один сервис, как это

public class OnClearFromRecentService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("ClearFromRecentService", "Service Started");
    return START_NOT_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("ClearFromRecentService", "Service Destroyed");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("ClearFromRecentService", "END");
    //Code here
    stopSelf();
}

}

2) зарегистрировать этот сервис в manifest.xml

<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />

3) Затем запустите эту услугу на вашей всплывающей активности

startService(new Intent(getBaseContext(), OnClearFromRecentService.class));

А теперь всякий раз, когда вы очистите свое приложение от недавнего Android, тогда этот метод onTaskRemoved() будет выполняться.

Ответ 3

Я решил аналогичную проблему. Если вы хотите, после прокрутки из недавней задачи, и при следующем запуске он будет вести себя правильно, выполните следующие шаги: -

1) Сохранить идентификатор процесса в общих предпочтениях:

SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

2) Когда приложение запускается из пусковой установки после очистки от недавней задачи, выполните следующее:

int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);

int currentProcessID = android.os.Process.myPid();

if ((previousProcessID == currentProcessID)) {
    // This ensures application not killed yet either by clearing recent or anyway
} else {
    // This ensures application killed either by clearing recent or by anyother means
}

Ответ 4

Когда вы нажимаете home - onPause и onStop вашей активности вызывается, поэтому в это время вы должны делать все сбережения и очистку, потому что платформа Android не гарантирует, что onDestroy или любой другой будет задействован метод жизненного цикла, поэтому процесс может быть убит без уведомления.

Ответ 5

Вам нужно сохранить свои данные, когда вызывается onPause(). Посмотрите на эту диаграмму жизненного цикла: Разработчик Android

Вы можете увидеть, что приложение может быть убито после onPause() или onStop().

Управляйте своими данными и восстанавливайте их в onRestart()\onCreate().

Удачи!

Ответ 6

Вы не можете обрабатывать салфетки, потому что система просто удаляет ваш процесс из памяти, не вызывая обратного вызова.

Я проверил, что до того, как пользователь вызовет экран "последние приложения", всегда будет вызываться onPause(). Поэтому вам нужно сохранить все данные в методе onPause без проверки isFinishing().

Чтобы проверить обратную кнопку, используйте метод onBackPressed.

Ответ 7

Это сработало для меня на Android 6,7,8,9.

Сделайте один сервис, подобный этому:

 public class OnClearFromRecentService extends Service {

 @Override public IBinder onBind(Intent intent) {
     return null; }

 @Override public int onStartCommand(Intent intent, int flags, int
 startId) {
     Log.d("ClearFromRecentService", "Service Started");
     return START_NOT_STICKY; }

 @Override public void onDestroy() {
     super.onDestroy();
     Log.d("ClearFromRecentService", "Service Destroyed"); }

 @Override public void onTaskRemoved(Intent rootIntent) {
     Log.e("ClearFromRecentService", "END");
     //Code here
     stopSelf(); } }

2) Зарегистрируйте эту услугу в manifest.xml:

<service android:name="com.example.OnClearFromRecentService"
 android:stopWithTask="false" />

3) Затем запустите эту службу в своей всплывающей активности

 startService(new Intent(getBaseContext(),
 OnClearFromRecentService.class));

Ответ 8

ViewModel.onCleared() может быть полезен, если цель состоит в том, чтобы освободить некоторый ресурс (возможно, систему, работающую где-то еще в сети), когда пользователь выполняет неожиданный выход, проводя пальцем, а не нажимая кнопку "Стоп" или кнопку. [Именно так я и пришел к этому вопросу].

Приложение не получает уведомления, и Activity.onDestroy() вызывается для изменений конфигурации, таких как изменения ориентации, поэтому ответа нет. Но ViewModel.onCleared вызывается, когда приложение удаляется (а также когда пользователь выходит из действия). Если ресурс, который вы хотите использовать, связан с более чем одним действием в стеке, вы можете добавить счетчики ссылок или какой-либо другой механизм, чтобы решить, должен ли ViewModel.onClear освободить ресурс.

Это еще одна из многих веских причин использовать ViewModel.

Боб