Как обрабатывать код, когда приложение убивается путем считывания в android?
Если мое приложение работает, и я нажимаю кнопку Home, приложение переходит в фоновом режиме. Теперь, если долго нажимать кнопку home и убить приложение, проводя его из списка последних приложений, ни одно из событий, таких как onPause()
,onStop()
или onDestroy()
вызывается, скорее, процесс прекращается. Поэтому, если я хочу, чтобы мои службы останавливались, убивали уведомления и отменяли регистрацию слушателей, как я могу это сделать? Я прочитал довольно много статей и блогов, но не получил никакой полезной информации, и я не нашел никакой документации о оно.
Любая помощь будет оценена по достоинству.
Спасибо заранее.
6 ответов:
Я только что решил аналогичную проблему.
вот что вы можете сделать, если его как раз об остановке обслуживания когда приложение убивается путем считывания из списка последних приложений.
внутри вашего файла манифеста, держите флаг
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(); }
см. у меня вопрос для более подробной информации, которая содержится другой части кода.
надеюсь, что это помогает.
нашел один способ сделать это
сделать один сервис такой
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.