Search code examples
androidalarmmanager

Scheduling Multiple Non Recurring Non Fixed Interval Events


Hi I am trying to create a simple program to schedule an event to be triggered after some time whenever a button is clicked.

For my code below i can getting all the received event together at once instead of at the tabulated interval.

The code are as follows :

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    findViewById(R.id.the_button).setOnClickListener(this);
}

private void setup() {
    br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context c, Intent i) {
            Date d = new Date();
            CharSequence s  = DateFormat.format("mm:ss ", d.getTime());
            Log.i("trigger"," " + s);
        }
    };
    registerReceiver(br, new IntentFilter("com.text.timer") );
    pi = PendingIntent.getBroadcast( this, 0, new Intent("com.text.timer"), 0 );
    am = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
}

@Override
public void onClick(View v) {
    setup();
    am.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TWENTY_SECONDS, pi );
    Date d = new Date();
    CharSequence s  = DateFormat.format("mm:ss ", d.getTime());
    Log.i("clicked"," " + s);
    count++;
}

@Override
protected void onDestroy() {
    am.cancel(pi);
    unregisterReceiver(br);
    super.onDestroy();
}

My Logcat testing result

06-29 05:04:05.501: I/clicked(1849):  04:05 
06-29 05:04:06.561: I/clicked(1849):  04:06 
06-29 05:04:07.551: I/clicked(1849):  04:07 
06-29 05:04:09.621: I/trigger(1849):  04:09 
06-29 05:04:09.651: I/trigger(1849):  04:09 
06-29 05:04:09.701: I/trigger(1849):  04:09 
06-29 05:04:09.741: I/trigger(1849):  04:09 
06-29 05:04:09.781: I/trigger(1849):  04:09 

Solution

  • A few things:

    -don't register a receiver every click. do it once (in you onCreate for instance).

    -in order for you to get different onReceive calls on the same broadcast, you need to add a request code to each one of your pending intents. you can use "count" for that.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        am = (AlarmManager) (this.getSystemService(Context.ALARM_SERVICE));
    
        br = new BroadcastReceiver() {
            @Override
            public void onReceive(Context c, Intent i) {
                Date d = new Date();
                CharSequence s = DateFormat.format("mm:ss ", d.getTime());
                Log.i("trigger", " " + s);
            }
        };
    
        registerReceiver(br, new IntentFilter("com.text.timer"));
    
        findViewById(R.id.the_button).setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        pi = PendingIntent.getBroadcast(this, count, new Intent(
                "com.text.timer"), 0);
        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + TWENTY_SECONDS, pi);
        Date d = new Date();
        CharSequence s = DateFormat.format("mm:ss ", d.getTime());
        Log.i("clicked", " " + s);
        count++;
    }
    
    @Override
    protected void onDestroy() {
        am.cancel(pi);
        unregisterReceiver(br);
        super.onDestroy();
    }