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&nbsp;Устройство, как Настройки> Аккумулятор> Выровнять пробуждение> Отключено обе опции. Если он включен, батарея может игнорировать принудительные пробуждения из приложений.

Мои вопросы:

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

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

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

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