Китайский Android Устройства Killing Background Service - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь запустить фоновую службу в android приложении. Я попробовал стандартный способ сделать это и множество других настроек. Проблема заключается в том, что когда приложение закрывается из последних приложений, служба уничтожается. Это происходит только на китайских Android устройствах, таких как Oppo, Vivo, Xiomi и др. c. Он отлично работает на всех других брендах.

Я пробовал следующие решения.

  1. Отмена действия OnStartCommand() для возврата START_STICKY. Это все еще не перезапускает активность после закрытия приложения, как и ожидалось.

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            return START_STICKY;
        }
    
  2. Добавил приложение к исключениям экономии заряда батареи, чтобы оно не закрывало ее для экономии заряда батареи в режиме DOZE.

  3. Предоставил приложению разрешение на Auto-Start из настроек безопасности телефона.

  4. Запустил службу как служба переднего плана, включая постоянное уведомление.

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");
        createNotificationChannel();
        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Foreground Service")
                .setContentText(input)
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentIntent(pendingIntent)
                .build();
        startForeground(1, notification);
        //do heavy work on a background thread
        //stopSelf();
        return START_NOT_STICKY;
    }
    
  5. Реализован подход Alarm Manager к запуску службы после ее уничтожения в onTaskRemoved() и onDestroy() методах обслуживания.

    <service
         android:name=".MyService"
         android:enabled="true"
         android:exported="true"
         android:stopWithTask="false" />
    
    @Override
        public void onTaskRemoved(Intent rootIntent){
            Log.d("Service:","I am being closed!");
            Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
            restartServiceIntent.setPackage(getPackageName());
    
            PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
            AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
            alarmService.set(
                    AlarmManager.ELAPSED_REALTIME,
                    SystemClock.elapsedRealtime() + 1000,
                    restartServicePendingIntent);
            super.onTaskRemoved(rootIntent);
        }
    
  6. Я также пытался использовать диспетчер рассылки, чтобы запустить службу, получающую рассылку от активности, когда она закрыта.

    <receiver
         android:name=".SensorRestarterBroadcastReceiver"
         android:enabled="true"
         android:exported="true"
         android:label="RestartServiceWhenStopped"
         />
    
    public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops!");
            context.startService(new Intent(context, MyService.class));;
        }
    }
    

Однако служба не запускается снова на этих китайских устройствах специально. В то время как фоновые сервисы Whatsapp, Facebook и некоторых известных приложений возвращаются через несколько минут после закрытия приложения. Пожалуйста, предложите правильный способ достижения этого.

Я пробовал решения, предоставленные на Фоновая служба не перезапускается после убийства в oppo, vivo, mi android версии 7.1.2 , как также описано над. Это не решает мою проблему.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Это будет происходить в основном для оптимизации заряда батареи и повышения производительности телефона.

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

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

ИЛИ

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

android: excludeFromRecents = "true"

0 голосов
/ 04 апреля 2020

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

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