以编程方式设置android闹钟

我试图build立一个个人的应用程序,将在DeskClock应用程序中设置警报。 我可以让它在当天的任何时候设置闹钟,但是我怎样才能设置第二天或稍后的闹钟。 通过Android中的AlarmClock api看,我没有看到一个正常的方式来做到这一点。 这甚至有可能吗?

顺便说一句,这是我设置警报的代码,可能不是很漂亮,但我正在学习。

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); } } 

Solutions Collecting From Web of "以编程方式设置android闹钟"

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> 

就像一个真正的闹钟,我没有看到为未来的date设置闹钟。 我认为这需要两个选项之一:

  1. AlarmManager(触发应用程序服务在期望的未来date在AlarmClock中创build警报)和AlarmClock(实际处理警报)的组合。 不要忘记监听BOOT_COMPLETED广播,以重置AlarmManager警报,因为它们在重新启动后不会保留。

  2. 使用AlarmManager触发模拟警报的应用程序服务和UI。 这将需要你考虑电话状态和你不必担心与AlarmClock等的东西。

我想你可以让你的应用程序调出AlarmClock对话框,允许用户设置循环警报和其他你不能通过意图执行的选项。

如何尝试待处理的意图?

只需提前几天更改日历值?

 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);