Android Как установить точный повторяющийся сигнал тревоги? - PullRequest
0 голосов
/ 02 января 2019

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

Видя, как для Repeating Android предоставляет только Inexact сигнал тревоги с возможной задержкой 75% выбранного интервала , я попытался сделать Exact тревогу, которая при срабатывании снова срабатывает.Этот тип тревоги работает отлично, пока мой экран включен.Но как только он засыпает, первый раз будильник срабатывает нормально, но второй сигнал, который устанавливается программно, срабатывает с задержкой, как если бы я использовал метод Inexact.

В качестве альтернативного решения ядумая о создании InexactRepeating сигнала тревоги, который будет срабатывать каждую минуту, чтобы проверить, настало ли время.Таким образом, мой сигнал тревоги будет с интервалом неточности 2 минуты, что является приемлемым.Но я не уверен, насколько это будет напрягать батарею телефона.

Любые идеи, ребята?

Вот моя попытка Exact тревоги:

AlarmManager.java

 public static void setAlarm(Context context){
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);

        //SET BROADCAST RECEIVER WHICH WILL BE THE ONE TO LISTEN FOR THE ALARM SIGNAL
        Intent intent = new Intent(context, AlarmTriggerBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 22222, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        //SETING THE ALARM
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
        } else {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 300000, pendingIntent);
        } 

    }

AlarmTriggerBroadcastReceiver.java

public class AlarmTriggerBroadcastReceiver extends BroadcastReceiver {

    private final static String TAG_ALARM_TRIGGER_BROADCAST = "ALARM_TRIGGER_BROADCAST";

    @Override
    public void onReceive(Context context, Intent intent) {
        //WAKE UP DEVICE
        WakeLocker.acquire(context);

            //LAUNCH PAGE
            Intent intent1 = new Intent();
            intent1.setClassName(context.getPackageName(), SomeActivity.class.getName());
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent1);


            Toast.makeText(context, "TOAST ALARM", Toast.LENGTH_LONG).show();
        };

        //SET NEW ALARM
        AlarmManagerActivity.setAlarm(context);
        WakeLocker.release();   

    }

}

WakeLocker.java

//WAKES UP DEVICE IF PHONE'S SCREEN LOCKED
public abstract class WakeLocker {
    private static PowerManager.WakeLock wakeLock;

    public static void acquire(Context ctx) {
        //if (wakeLock != null) wakeLock.release();

        PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, "myapp:WAKE_LOCK_TAG");
        wakeLock.acquire();
    }

    public static void release() {
        if (wakeLock != null) wakeLock.release(); wakeLock = null;
    }
}

Manifest

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.SET_ALARM"/>

  <receiver
            android:name=".Alarm.AlarmTriggerBroadcastReceiver"
            android:process=":remote">

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
            <intent-filter android:priority="1">
                <action android:name="my.app.here.ALARM_RECIEVED" />
            </intent-filter>
        </receiver>

Что, товарищи по кодированию?

1 Ответ

0 голосов
/ 02 января 2019

Вы пытались использовать WorkManager вместо того, чтобы использовать широковещательные приемники? Подробнее здесь . И приложение демо здесь .

...