Android AlarmManager.setExactAndAllowWhileIdle () и WakefulBroadcastReceiver Не работает на некоторых новых изготовленных и недорогих устройствах

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

В моем приложении для Android я должен каждые полчаса просыпать устройство, чтобы узнать текущее местоположение, и отправлять его на сервер. Для этого я использовалAlarmManager сsetExactAndAllowWhileIdle() метод иWakefulBroadcastReceiver, Это работает нормально, я почти все стандартные / популярные устройства, такие как Samsung, LG (Nexus), Sony, Panasonic, Lenovo, Motorola, Micro Max и т. Д. Но некоторые другие устройства в основном китайские устройства не поддерживают или не могут позволить устройство выйти из режима сна сsetExactAndAllowWhileIdle(), Я проверил это вleeco letV (Android OS 6.1) устройство, которое не позволяет диспетчеру тревоги просыпаться в определенный интервал.

Моя часть кода, которую я упомянул ниже:

UserTrackingReceiverIntentService.java

public class UserTrackingReceiverIntentService extends IntentService {

    public static final String TAG = "UserTrackingReceiverIntentService";
    Context context;
    public UserTrackingReceiverIntentService() {
        super("UserTrackingReceiverIntentService");
    }

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onHandleIntent(Intent intent) {
        this.context = this;

        if (!Util.isMyServiceRunning(LocationService.class, context)) {
            context.startService(new Intent(context, LocationService.class));
        }

        Calendar calendar = Calendar.getInstance();
        //********************************** SETTING NEXT ALARM *********************************************
            Intent intentWakeFullBroacastReceiver = new Intent(context, SimpleWakefulReceiver.class);
            PendingIntent sender = PendingIntent.getBroadcast(context, 1001, intentWakeFullBroacastReceiver, 0);
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);

        if (calendar.get(Calendar.MINUTE) >= 0 && calendar.get(Calendar.MINUTE) < 30) {
            calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
            calendar.set(Calendar.MINUTE, 30);
            calendar.set(Calendar.SECOND, 0);
        } else if (calendar.get(Calendar.MINUTE) >= 30) {
            if (calendar.get(Calendar.HOUR_OF_DAY) == 23) {
                calendar.set(Calendar.HOUR_OF_DAY, 0);
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            } else {
                calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
            }
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
        } else {
            calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY));
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
        }

        //MARSHMALLOW OR ABOVE
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), sender);
        }
        //LOLLIPOP 21 OR ABOVE
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), sender);
            alarmManager.setAlarmClock(alarmClockInfo, sender);
        }
        //KITKAT 19 OR ABOVE
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), sender);
        }
        //FOR BELOW KITKAT ALL DEVICES
        else {
            alarmManager.set(AlarmManager.RTC_WAKEUP,
                    calendar.getTimeInMillis(), sender);
        }


        Util.registerHeartbeatReceiver(context);
        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }
}

Каждый раз, когда сервис выше установленного, установите следующий сигнал тревоги через 30 минут после вызова.

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Calendar calendar = Calendar.getInstance();
        Intent service = new Intent(context, UserTrackingReceiverIntentService.class);
        Date date = new Date();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String DateTime = sdf.format(date);
        DateTime = Util.locatToUTC(DateTime);
        service.putExtra("date", String.valueOf(DateTime));

        String latitude = Util.ReadSharePrefrence(context, "track_lat");
        String longitude = Util.ReadSharePrefrence(context, "track_lng");

        service.putExtra("lat", latitude);
        service.putExtra("lon", longitude);

        Log.i("SimpleWakefulReceiver", "Starting service @ " + calendar.get(Calendar.HOUR_OF_DAY) + " : " + calendar.get(Calendar.MINUTE) + " : " + calendar.get(Calendar.SECOND));

        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, service);
    }
}

Как я изменил некоторые настройки вручную изleeco letV Устройство, как Настройки> Аккумулятор> Выровнять пробуждение> Отключено обе опции. Если он включен, батарея может игнорировать принудительные пробуждения из приложений.

Мои вопросы:

Что случилось в таких устройствах? Почему они не позволяют срабатывать сигнализации в определенный промежуток времени?

В некоторых устройствах, таких как сигнализация Gionee s plus, срабатывает на 2-3 минуты позже ... почему?

android.net.conn.CONNECTIVITY_CHANGE широкополосный приемник для прослушивания при изменении сетевого подключения ..... Что делать, если он не работает на некоторых устройствах, таких как Gionee s plus?

Существует множество вариантов настройки оптимизации батареи для разных производителей ... Может ли это повредить фоновым службам нашего приложения, если есть какое решение для этого?

Ответы на вопрос(4)

Ваш ответ на вопрос