onTaskRemoved не вызывается, если действие, запущенное службой, удалено - PullRequest
0 голосов
/ 29 октября 2018

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

Я опишу мою проблему, используя два случая.

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

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

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

Я перепробовал все методы, упомянутые в стеке, такие как START_STICKY и onTaskRemoved, но я не могу заставить его работать.

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

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

@Override
public void finish() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    } else {
        super.finish();
    }

}

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

@Override
public void onTaskRemoved(Intent rootIntent){
    Log.d("testing 12","onTaskRemoved");
    Intent restartServiceTask = new Intent(getApplicationContext(),CBWatcherService.class);
    restartServiceTask.setPackage(getPackageName());
    PendingIntent restartPendingIntent =PendingIntent.getService(getApplicationContext(), 1,restartServiceTask, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager myAlarmService = (AlarmManager) getApplicationContext().getSystemService(this.ALARM_SERVICE);
    myAlarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartPendingIntent);

    super.onTaskRemoved(rootIntent);
}

@Override
public int onStartCommand(Intent intent,int flag,int startId){
    super.onStartCommand(intent, flag, startId);
    return START_STICKY;

}

РЕДАКТИРОВАТЬ 1
Мне просто нужен сервис, чтобы остаться в живых. Вот вещи, которые не будут мешать работе пользователя в моем случае приложения
1. Уничтожение действия программным способом при вызове onPause, чтобы служба не была убита, допустимо, если вы сделаете это
2. Отображение уведомления в течение нескольких секунд приемлемо
3. Перезапуск услуги допустим

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

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

Почему не работает onTaskRemoved?
То, что я делал, не работало, потому что мой сервис раньше разрушался и, следовательно, он не был активным для прослушивания onTaskRemoved.

Как я это решил?
Решением этой проблемы была проверка активности (запущенной службой), чтобы проверить, является ли служба активной или нет. Как и в моем случае, служба разрушалась. Следовательно, мне нужно снова запустить службу, если она еще не запущена.
Он даже соответствует шаблону проектирования OREO, поскольку мы можем запустить фоновую службу, когда приложение находится на переднем плане, и служба останется в живых, даже если действие будет уничтожено.

На Oreo, хотя через какое-то время сервис разрушается, но это другая проблема.

Подробнее

0 голосов
/ 09 ноября 2018

В Android Oreo произошла смена парадигмы, чтобы ограничить выполнение фоновых сервисов. Это была частая критика, затрагивающая время автономной работы, производительность и безопасность. Как указано в комментариях выше, есть альтернативные подходы, такие как JobScheduler.

Рефакторинг сервисов по шаблону JobScheduler может быть довольно сложным. Я советую вам посмотреть, как изменить IntentService на JobintentService из библиотеки поддержки Android v4. Он использует JobScheduler для Oreo и более поздних целей, но возвращается к более старому дизайну IntentService на старых устройствах. Вам просто нужно заменить переопределение onHandleIntent на onHandleWork в реализации службы.

Добавить

android:permission="android.permission.BIND_JOB_SERVICE"

к объявлению сервиса в вашем AndroidManifest.xml. Также может быть полезно добавить

 <uses-permission android:name=”android.permission.WAKE_LOCK” />

Но, сказав все это, прочитав ваш вопрос, мне кажется, ваша основная жалоба связана с косметической проблемой услуг переднего плана, требующих уведомления. На мой взгляд, ваше решение - либо просто использовать Context.startForegroundService, либо убедиться, что ваш сервис связан. В любом случае для пользователя, на котором запущена служба, есть видимый контент. Вам будет нелегко пытаться подорвать дизайнерские решения Android; Лучше принять это - они хотят, чтобы вы теперь показывали эти уведомления.

В любом случае обновление кода для новых целей Android все еще является хорошей практикой, даже если вы не можете полностью избежать этих значков уведомлений.

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