简体   繁体   中英

Alarm manager doesn't repeat?

so I've made an code in which alarm manager should fire at exact time and repeat every minute, and it partially works, it fires for the first time but it doesn't repeat after given interval(one minute).

Main activity:

public void SetAlarm()
    {
        final Button button = findViewById(R.id.button); // replace with a button from your own UI
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override public void onReceive( Context context, Intent _ )
            {
                Toast.makeText(context, "Nope", Toast.LENGTH_SHORT).show();
                context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
            }
        };

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 20);
        cal.set(Calendar.MINUTE, 30);
        cal.set(Calendar.SECOND, 0);

        this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );

        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
        AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.setInexactRepeating( AlarmManager.RTC_WAKEUP, cal.getTimeInMillis() + 1000*5, 6000, pintent );
    }

    public void klik(View view) {
        SetAlarm();
    }

}

Try using setRepeating() :

manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
    cal.getTimeInMillis() + 1000*5, 6000, pintent); 

For best practices you can see this doc .

I think the minimum repeat in ms is 60000 (1 min) for security, and battery life:)

Value will be forced up to 60000 as of Android 5.1...

If its all of your Main Activity i do not understand it. Why do u define button in SetAlarm() ((SetAlarm called on click))?!

I think you should try a fully new way. Like this....

  1. In Main Activity onCreate event define button:

     Button btn_yrbnt = findViewById(R.id.btn);
  2. Make an event for onClick

    btn_yrbnt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startAlarm(); } });
  3. Set the alarm in the startAlarm() event

    Intent intent = new Intent(this, Alarm.class); //In 4th step u understand it PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 8); calendar.set(Calendar.MINUTE, 10); calendar.set(Calendar.SECOND, 1); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), REPEAT_TIME, pendingIntent); //Repeat time is bigger than 60000ms but u can use AlarmManager.INTERVAL_DAY for example or AlarmManager.INTERVAL_FIFTEEN_MINUTES
  4. Make a new Java class named Alarm.class with BroadCastReceiver superclass

     public class Alarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Type what do u want to do on Alarm's fire!!!! }}
  5. IMPORTANT! In ur manifest should link the Receiver

    <receiver android:name=".Alarm" android:enabled="true" android:exported="true"/>

If u do everything good, your alarm works fine! Sry my bad english!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM