@konfederation

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

На китайфонах типа huawei и xiaomi(возможно и другие) некорректно работает AlarmManager. Находил инфу, что там установлены сервисы, убивающие процессы для сохранения заряда батареи, но решения данной проблемы так и не нашел.
  • Вопрос задан
  • 830 просмотров
Решения вопроса 1
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));
        }
        //...
    }


Готово :)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы