Android闹钟服务详解
通常情况下我们有这样的需求,规定程序在指定的时间内启动,这样就用到了android为我们提供的闹钟服务
下面就一个简单的例子,来说明如何使用android的闹钟服务
1、首先创建布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal"> <TimePicker android:id="@+id/time" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/msg" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="当前没有设置闹钟" /> <Button android:id="@+id/set" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="设置闹钟" /> <Button android:id="@+id/delete" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="删除闹钟" /> </LinearLayout>
第二步:在activity中使用闹钟服务
package com.jiao.alarm; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; import android.widget.Toast; public class MyAlarmManager extends Activity { private AlarmManager alarm = null; // 闹钟管理 private Button set = null; // 按钮组件 private Button delete = null; // 按钮组件 private TextView msg = null; // 文本显示组件 private Calendar calendar = Calendar.getInstance(); // 取得Calendar对象 private TimePicker time = null; // 时间选择器 private int hourOfDay = 0; // 保存设置的时 private int minute = 0; // 保存设置的分 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); // 调用布局管理器 time = (TimePicker) super.findViewById(R.id.time); // 取得时间选择器 set = (Button) super.findViewById(R.id.set); // 取得按钮组件 delete = (Button) super.findViewById(R.id.delete); // 取得按钮组件 msg = (TextView) super.findViewById(R.id.msg); // 取得组件 set.setOnClickListener(new SetOnClickListenerImpl()); // 设置单击事件 delete.setOnClickListener(new DeleteOnClickListenerImpl()); // 设置单击事件 alarm = (AlarmManager) super.getSystemService(Context.ALARM_SERVICE); // 取得闹钟服务 time.setOnTimeChangedListener(new OnTimeChangedListenerImpl()); // 设置时间改变监听 time.setIs24HourView(true); // 24小时制 } private class OnTimeChangedListenerImpl implements OnTimeChangedListener { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { calendar.setTimeInMillis(System.currentTimeMillis()); // 设置当前时间 calendar.set(Calendar.HOUR_OF_DAY,hourOfDay); // 设置小时 calendar.set(Calendar.MINUTE, minute); // 设置分钟 calendar.set(Calendar.SECOND, 0); // 设置秒 calendar.set(Calendar.MILLISECOND, 0); // 设置毫秒 hourOfDay = hourOfDay; // 保存设置的小时 minute = minute; // 保存设置的分钟 } } private class SetOnClickListenerImpl implements OnClickListener { @Override public void onClick(View view) { Intent intent = new Intent(MyAlarmManager.this,MyAlarmReceiver.class); // 指定跳转的Intent intent.setAction("com.jiao.action.setalarm"); // 定义广播的Action PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManager.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); // 指定PendingIntent alarm.set(AlarmManager.RTC_WAKEUP,MyAlarmManager.this.calendar.getTimeInMillis(), sender); // 设置闹钟 msg.setText("闹钟响起的时间是:"+ hourOfDay + "时"+ minute + "分。"); // 提示文字 Toast.makeText(MyAlarmManager.this, "闹钟设置成功!",Toast.LENGTH_SHORT).show(); // 显示提示信息 } } private class DeleteOnClickListenerImpl implements OnClickListener { @Override public void onClick(View view) { if (alarm != null) { Intent intent = new Intent(MyAlarmManager.this,MyAlarmReceiver.class);// 设置Intent PendingIntent sender = PendingIntent.getBroadcast(MyAlarmManager.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); // 指定PendingIntent alarm.cancel(sender); // 取消闹钟 msg.setText("当前没有设置闹钟。"); // 提示文字 Toast.makeText(MyAlarmManager.this, "闹钟删除成功!",Toast.LENGTH_SHORT).show(); // 显示提示信息 } } } }
第三步:在上一步的代码中自定义了一个广播接收者,所以再创建一个广播接收者
package com.jiao.alarm; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent it = new Intent(context, AlarmMessage.class);// 定义要操作的Intent,要转到的activity在这里设置就可以了 it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 传递一个新的任务标记 context.startActivity(it); // 启动Intent } }
最后记得在清单文件中配置,注册广播接收者
<receiver android:name="MyAlarmReceiver" android:enabled="true" android:process=":remote"> <intent-filter> <action android:name="com.jiao.action.setalarm" /> </intent-filter> </receiver>