Set a software alarm for Android

I am trying to create a personal application that will set alarms in the DeskClock application. I can get it to set an alarm at any time in the current day, but how can I set an alarm the next day or later this week. Looking through AlarmClock api in android, I don't see a normal way to do this. Is it possible?

Btw is my alarm setup code, it may not be very pretty, but I learn when I go.

package com.netwokz.setit; import java.util.Calendar; import java.util.GregorianCalendar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.provider.AlarmClock; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener { Button btnSetAlarm; EditText etHour, etMinute; int minute, hour, day; Calendar cal; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); btnSetAlarm = (Button) findViewById(R.id.btn_set_alarm); etHour = (EditText) findViewById(R.id.etHour); etMinute = (EditText) findViewById(R.id.etMinute); btnSetAlarm.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity, menu); return true; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_set_alarm: setAlarm(); break; } } private void setAlarm() { cal = new GregorianCalendar(); cal.setTimeInMillis(System.currentTimeMillis()); day = cal.get(Calendar.DAY_OF_WEEK); hour = cal.get(Calendar.HOUR_OF_DAY); minute = cal.get(Calendar.MINUTE); Intent i = new Intent(AlarmClock.ACTION_SET_ALARM); i.putExtra(AlarmClock.EXTRA_HOUR, hour + Integer.parseInt(etHour.getText().toString())); i.putExtra(AlarmClock.EXTRA_MINUTES, minute + Integer.parseInt(etMinute.getText().toString())); i.putExtra(AlarmClock.EXTRA_SKIP_UI, true); startActivity(i); } } 
+8
java android
source share
3 answers

MainActivity.java

 public class MainActivity extends Activity {  TimePicker myTimePicker;  Button buttonstartSetDialog;  TextView textAlarmPrompt;  TimePickerDialog timePickerDialog;  final static int RQS_1 = 1;  @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    textAlarmPrompt = (TextView) findViewById(R.id.alarmprompt);    buttonstartSetDialog = (Button) findViewById(R.id.startAlaram);    buttonstartSetDialog.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {        textAlarmPrompt.setText("");        openTimePickerDialog(false);      }    });  }  private void openTimePickerDialog(boolean is24r) {    Calendar calendar = Calendar.getInstance();    timePickerDialog = new TimePickerDialog(MainActivity.this,        onTimeSetListener, calendar.get(Calendar.HOUR_OF_DAY),        calendar.get(Calendar.MINUTE), is24r);    timePickerDialog.setTitle("Set Alarm Time");    timePickerDialog.show();  }  OnTimeSetListener onTimeSetListener = new OnTimeSetListener() {    @Override    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {      Calendar calNow = Calendar.getInstance();      Calendar calSet = (Calendar) calNow.clone();      calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);      calSet.set(Calendar.MINUTE, minute);      calSet.set(Calendar.SECOND, 0);      calSet.set(Calendar.MILLISECOND, 0);      if (calSet.compareTo(calNow) <= 0) {        // Today Set time passed, count to tomorrow        calSet.add(Calendar.DATE, 1);      }      setAlarm(calSet);    }  };  private void setAlarm(Calendar targetCal) {    textAlarmPrompt.setText("\n\n***\n" + "Alarm is set "        + targetCal.getTime() + "\n" + "***\n");    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);    PendingIntent pendingIntent = PendingIntent.getBroadcast(        getBaseContext(), RQS_1, intent, 0);    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),        pendingIntent);  } } 

Reciver.java

 public class AlarmReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context k1, Intent k2) {    // TODO Auto-generated method stub    Toast.makeText(k1, "Alarm received!", Toast.LENGTH_LONG).show();  } } 

main_activity.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  android:padding="10dp" >  <Button    android:id="@+id/startAlaram"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="Set Alaram Time" />  <TextView    android:id="@+id/alarmprompt"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:textColor="#000000" /> </LinearLayout> 

manifest.xml

 <application    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/AppTheme" >    <activity      android:name=".MainActivity"      android:label="@string/title_activity_main" >      <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>    </activity>    <receiver android:name=".AlarmReceiver" android:process=":remote" />  </application> 
+21
source share

Like a real alarm, I see no way to set an alarm for a future date. I think this requires one of two options:

  • The combination AlarmManager (to start the application service on the desired future date to create an alarm in AlarmClock), and then AlarmClock (to actually handle the alarm). Remember to listen to the BOOT_COMPLETED transmission to reset the AlarmManager, as they are not saved after a reboot.

  • Use the AlarmManager to start the application service and user interface that simulates an alarm. This will require you to review the status of the phone, etc., which you do not need to worry about in AlarmClock.

I think you can force the application to simply call the AlarmClock dialog, which allows the user to set repeating alarms and other parameters that you cannot fulfill with intent.

+2
source share

How to try a pending hint?

Just change the calendar value for a few days or so in advance.

 AlarmManager am = (AlarmManager)getSystemService(alarm); Intent i= new Intent("MY_INTENT"); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.MINUTE, 2); am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi); 
0
source share

All Articles