4、全局定时器:AlermManager
全局定时器是与应用程序独立的系统时间服务,并不依赖应用程序而存在。
该对象通过
AlarmManage alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);获得。
通过PendingIntent指定一个Activity,再通过setRepeating方法设置定时器
intent = new Intent(this, MyActivity.class); pendingActivityIntent = PendingIntent.getActivity(this, 0, intent, 0); alarmManager.setRepeating(AlarmManager.RTC, 0, 5000, pendingActivityIntent);
通过全局定时器,我们来演示一个每5秒更换手机壁纸的程序:
更换壁纸的Service类:
public class ChangeWallpaperService extends Service { private static int index = 0; private int[] resIds = new int[] { R.raw.wp1, R.raw.wp2, R.raw.wp3, R.raw.wp4, R.raw.wp5 }; @Override public void onStart(Intent intent, int startId) { if(index == 5) index = 0; InputStream inputStream = getResources().openRawResource(resIds[index++]); try { setWallpaper(inputStream); } catch (Exception e) { } super.onStart(intent, startId); } @Override public void onCreate() { super.onCreate(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; }在mainfirst中配置
<uses-permission android:name="android.permission.SET_WALLPAPER" />
全局定时器:
public class Main extends Activity implements OnClickListener { private Button btnStart; private Button btnStop; @Override public void onClick(View view) { AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getService(this, 0, new Intent(this, ChangeWallpaperService.class), 0); switch (view.getId()) { case R.id.btnStart: alarmManager.setRepeating(AlarmManager.RTC, 0, 5000, pendingIntent); btnStart.setEnabled(false); btnStop.setEnabled(true); break; case R.id.btnStop: alarmManager.cancel(pendingIntent); btnStart.setEnabled(true); btnStop.setEnabled(false); break; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnStart = (Button) findViewById(R.id.btnStart); btnStop = (Button) findViewById(R.id.btnStop); btnStop.setEnabled(false); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); } }
在创建PendingIntent对象时与service绑定,那么AlarmManager在执行时就会执行service的onStart方法(不是onCreate方法,因为他只会执行一次),获得Service的PendingIntent对象是使用getService方法,同理getActivity,getBroadcast。
下面演示另一个全局定时器的例子,本例是实现多次定时提醒功能。
定时提醒的原理:在添加时间节点后,需要将所添加的时间节点保存在文件或数据库中。本例使用前面介绍过的SharedPreferances来保存。然后使用AlarmManager每隔一分钟扫描一次,在扫描过程中获得当前时间的value,如果成功则说明当前时间为时间点,否则继续扫描。
本例使用BroadcastReceiver来处理定时提醒任务:
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { SharedPreferences sharedPreferences = context.getSharedPreferences( "alarm_record", Activity.MODE_PRIVATE); String hour = String.valueOf(Calendar.getInstance().get( Calendar.HOUR_OF_DAY)); String minute = String.valueOf(Calendar.getInstance().get( Calendar.MINUTE)); String time = sharedPreferences.getString(hour + ":" + minute, null); if (time != null) { MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.ring); mediaPlayer.start(); } } }
配置文件:
<receiver android:name=".AlarmReceiver" android:enabled="true" />主程序中每添加一个时间点就会在XML文件中保存所添加的时间点:
public class Main extends Activity implements OnClickListener { private TextView tvAlarmRecord; private SharedPreferences sharedPreferences; @Override public void onClick(View v) { View view = getLayoutInflater().inflate(R.layout.alarm, null); final TimePicker timePicker = (TimePicker) view .findViewById(R.id.timepicker); timePicker.setIs24HourView(true); new AlertDialog.Builder(this).setTitle("设置提醒时间").setView(view) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String timeStr = String.valueOf(timePicker .getCurrentHour()) + ":" + String.valueOf(timePicker.getCurrentMinute()); tvAlarmRecord.setText(tvAlarmRecord.getText() .toString() + "\n" + timeStr); sharedPreferences.edit().putString(timeStr, timeStr) .commit(); } }).setNegativeButton("取消", null).show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm); tvAlarmRecord = (TextView) findViewById(R.id.tvAlarmRecord); btnAddAlarm.setOnClickListener(this); sharedPreferences = getSharedPreferences("alarm_record", Activity.MODE_PRIVATE); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); alarmManager .setRepeating(AlarmManager.RTC, 0, 60 * 1000, pendingIntent); } }