Android убивает фоновые службы в xiaomi, huawei и т. д.

Мне нужно сделать мою службу неудержимой. Я попытался вернуть команду START_STICKY при запуске, она хорошо работает на эмуляторе, но при удалении приложения из диспетчера задач на моем устройстве (Xiaomi mi5s, Android 7) оно больше не создает себя.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return START_STICKY;
}

Обновлено: я дал разрешение на автоматический запуск и отключил правила защиты аккумулятора для приложения.

Обновлено: также я попытался использовать службу переднего плана. Однако его тоже убивают ..

   @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        Intent notificationIntent = new Intent(getApplicationContext(), StartActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent contentPendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setTicker(getResources().getString(R.string.app_name))
                .setContentText("Hello!")
                .setSmallIcon(R.mipmap.ic_launcher2)
                .setContentIntent(contentPendingIntent)
                .setOngoing(true)
                .build();
        notification.flags = notification.flags | Notification.FLAG_NO_CLEAR;
        startForeground(1, notification);

        return START_NOT_STICKY;
    }


---Activity
       ContextCompat.startForegroundService(this, new Intent(this, LockerService.class));

Logcat

2018-10-31 21:24:22.143 2168-2168/? D/wpa_supplicant: wlan0: Control interface command 'SIGNAL_POLL'
2018-10-31 21:24:22.555 1513-3093/? D/ProcessManager: update DY:[com.touchtype.swiftkey, com.miui.voip]
2018-10-31 21:24:22.560 1513-3093/? D/ProcessManager: remove task: TaskRecord{36f7d55 #495 A=me.ibrahimsn.applock U=0 StackId=1 sz=1}
2018-10-31 21:24:22.607 3103-3296/? I/WtEventController: dispatchSysInfoEvent AM_NEW_INTENT componentName:com.miui.home/.launcher.Launcher
2018-10-31 21:24:22.610 1513-9074/? D/ActivityTrigger: ActivityTrigger activityPauseTrigger 
2018-10-31 21:24:22.624 1513-9074/? I/Timeline: Timeline: App_transition_ready time:44879245
2018-10-31 21:24:22.626 1513-1604/? D/ActivityTrigger: ActivityTrigger activityStopTrigger 
2018-10-31 21:24:22.628 1513-1620/? I/Timeline: Timeline: App_transition_ready time:44879248
2018-10-31 21:24:22.630 1513-12578/? I/Timeline: Timeline: App_transition_ready time:44879251
2018-10-31 21:24:22.633 3185-3185/? D/SearchCardView: onVisibilityChanged: 0
2018-10-31 21:24:22.635 3185-3831/? I/RenderThread: RenderThread resumed
2018-10-31 21:24:22.635 3185-3831/? D/ScreenElementRoot: resume
2018-10-31 21:24:22.639 3185-3831/? I/NotifierManager: onRegister: miui.maml.NotifierManager$MultiBroadcastNotifier@46712e7
2018-10-31 21:24:22.646 1513-3093/? I/Timeline: Timeline: App_transition_ready time:44879267
2018-10-31 21:24:22.680 1513-1620/? I/Timeline: Timeline: App_transition_ready time:44879301
2018-10-31 21:24:22.686 2134-2134/? V/PhoneStatusBarPolicy: updateManagedProfile mManagedProfileFocused: false mManagedProfileInQuietMode: false mKeyguardVisible: false mCurrentUserId:0 mCurrentProfileId:0 mSecondSpaceStatusIconVisible: true showIcon:false
2018-10-31 21:24:22.689 1513-10970/? D/GraphicsStats: Buffer count: 4
2018-10-31 21:24:22.694 2134-2134/? D/StatusBar: onNotificationRemoved:  Key: 0|me.ibrahimsn.applock|1|null|10637

Как я могу это сделать?

Удаление приложений из последних убивает их процесс, включая службы. Если нет трансляции / события, чтобы запустить их снова, они не будут воссозданы.

Pawel 31.10.2018 14:21

Но он хорошо работает на эмуляторе и других устройствах. START_STICKY предназначен для перезапуска службы после уничтожения. @Pawel

melianor 31.10.2018 14:25

Используйте служба переднего плана.

greeble31 31.10.2018 14:56

Это тоже останавливается :( @ greeble31

melianor 31.10.2018 17:48

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

greeble31 31.10.2018 18:00

Сервисы переднего плана предназначены для минимального API 26, мое устройство - API 24 @ greeble31

melianor 31.10.2018 18:07

@mystogan Это распространенное заблуждение. Используйте Service.startForeground(); доступно с уровня API 5.

greeble31 31.10.2018 18:08

Я отредактировал свой вопрос @ greeble31

melianor 31.10.2018 18:11

@mystogan Итак, чтобы уточнить: вы запускаете приложение, видите свой значок на панели уведомлений, все в порядке, а затем, когда вы закрываете приложение, нажав «X» или используя жест смахивания, приложение завершает работу и значок панели уведомлений исчезнет. Верный? Есть ли какой-либо вывод logcat, связанный с завершением работы приложения?

greeble31 31.10.2018 18:20

Да, это правильно. Я добавил вывод logcat, когда я смахиваю и убиваю приложение. @ greeble31

melianor 31.10.2018 18:27

@mystogan Я не вижу ничего узнаваемого в логарифме. Может это проблема с некоторыми устройствами Xioami

greeble31 31.10.2018 18:30

Да, это связано с Xiaomi. Спасибо за ответы @ greeble31

melianor 31.10.2018 18:31
1
12
2 829
2

Ответы 2

В китайских ромах есть некоторые настройки, касающиеся жизненного цикла приложения.

Xiaomi убивает службы переднего плана без разбора (xiaomi redmi note4 (Android N), note 7 (Android P)). Так что действительно сложно добиться одинакового поведения на всех телефонах.

Вы можете попробовать перезапустить свою службу переднего плана, используя сигнал тревоги с помощью широковещательного приемника. Когда ваше приложение убивается, вам нужно установить этот будильник. Когда получено намерение, попробуйте запустить службу переднего плана с помощью startForeground (). Не забудьте также привязать службу переднего плана и отключить ограничение заряда батареи (и другие связанные вещи) в соответствии с вашим устройством.

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

Помните, что для Android> = Oreo единственный способ выжить и работать сервису - это, по-видимому, способ обслуживания переднего плана (связанная служба с отключенной оптимизацией батареи для некоторых устройств)

Вы можете найти полезные материалы по адресу:

Никогда не заканчивающаяся фоновая служба

LocationUpdatesForegroundService

Второй пример работает на эмуляторе на другой версии Android (5/7). Он работает на Galaxy S3 с прошивкой Resurrection Remix (Android 7) и работает на некоторых моделях Huawei (Oreo, Pie).

Работать с сервисами в android действительно сложно. Наберитесь терпения и продолжайте.

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

Другие вопросы по теме