• AlarmManager некорректно работает на китайфонах, как решить данную проблему?

    AlexMarken
    @AlexMarken
    Нужно сделать неубиваемый сервис.

    1. Создаешь сервис, который будет запускать AlarmManager
    1.1 Класс сервиса:
    public class MessageService extends Service  {
        public static PendingIntent pendingIntent = null;
    
        private void serviceMessageStart() {
    
            Intent alarmIntent = new Intent(MessageService.this, AlarmReceiver.class);
            pendingIntent = PendingIntent.getBroadcast(MessageService.this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    
            if (pendingIntent != null) {
                AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 30 * 1000, 15 * 60 * 1000, pendingIntent);
            }
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void onCreate() {
            super.onCreate();
    
    
            serviceMessageStart();
        }
    
        public void onDestroy() {
            super.onDestroy();
        }
    }

    1.2 Создаешь Receiver, на который будет ссылаться AlarmManager после выполнения:
    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Выполняем свои действия
        }
    }

    1.3 Регистрируем Service и Receiver в Manifest:
    <application
            <service
                android:name="ИМЯ.ПАКЕТА.ПРИЛОЖЕНИЯ.MessageService"
                android:enabled="true"
                android:exported="false">
            </service>
    
            <receiver android:name="ИМЯ.ПАКЕТА.ПРИЛОЖЕНИЯ.BootReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>
    </application>

    2. MainActivity. В манифесте мы прописали, чтобы сервис запускался автоматически, как только устройство будет включено. Так же мы уже сделали его неубиваемым. Теперь сделаем активацию сервиса, если он не был запущен:
    public boolean isServiceRunning(Class<?> serviceClass) {
            ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
                if (serviceClass.getName().equals(service.service.getClassName())) {
                    return true;
                }
            }
            return false;
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //...
            if(!isServiceRunning(MessageService.class)) {
                startService(new Intent(this, MessageService.class));
            }
            //...
        }


    Готово :)
    Ответ написан
    Комментировать