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


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

6 75

6 ответов:

Я только что решил аналогичную проблему.

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

внутри вашего файла манифеста, держите флаг stopWithTask как true для обслуживания. Например:

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

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

  1. внутри вашего Манифеста файл, держите флаг stopWithTask как false для обслуживания. Например:

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

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

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

надеюсь, что это помогает.

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

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

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) зарегистрировать эту службу в манифесте.xml

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

3) затем запустите эту службу на вашем всплеск активности

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

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

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

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
}

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

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

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

обрабатывать ваши данные там и восстановить его в onRestart()\ onCreate().

удачи!

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

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

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