AlarmManager的本质是一个全局的定时器,AlramManager可在指定的时间或周期启动其他组件。
1.set(int type,long triggerAtTime,PendingIntent operation):
设置在triggerAtTime时间启动用operation参数指定的组件。其中第一个指定了启动的服务类型。可选的参数如下:
ELAPSED_REALTIME:指定从现在开始时间过了一定时间后启动operation所对应的组件。
ELAPSED_REALTIME_WAKEUP:同上。只不过在系统关机时也可以启动operation所对应的组件。
RTC:指定当系统调用System.currentTimeMillis()方法返回值与TriggerAtTime相等时启动operation所对应的组件。
RTC_WAKEUP:同上,只不过系统关机也会执行operation所对应的组件
2.setInexactRepeating(int type,long triggerAtTime,long interval,PendingIntent operation):
设置一个非精确的周期性执行任务。
3.setRepeating(int type,long triggrtAtTime,long interval,PendingIntent operation):
设置一个周期性执行的任务。
4.cancel(PendingIntent operation):
取消定时服务。
设置界面:
import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.app.TimePickerDialog; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TimePicker; import android.widget.Toast; public class AlarmTest extends Activity { Button setTime; AlarmManager aManager; Calendar currentTime = Calendar.getInstance(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取程序界面的按钮 setTime = (Button) findViewById(R.id.setTime); // 获取AlarmManager对象 aManager = (AlarmManager) getSystemService( Service.ALARM_SERVICE); // 为“设置闹铃”按钮绑定监听器。 setTime.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { Calendar currentTime = Calendar.getInstance(); // 创建一个TimePickerDialog实例,并把它显示出来。 new TimePickerDialog(AlarmTest.this, 0, // 绑定监听器 new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker tp, int hourOfDay, int minute) { // 指定启动AlarmActivity组件 Intent intent = new Intent(AlarmTest.this, AlarmActivity.class); // 创建PendingIntent对象 PendingIntent pi = PendingIntent.getActivity( AlarmTest.this, 0, intent, 0); Calendar c = Calendar.getInstance(); // 根据用户选择时间来设置Calendar对象 c.set(Calendar.HOUR, hourOfDay); c.set(Calendar.MINUTE, minute); // 设置AlarmManager将在Calendar对应的时间启动指定组件 aManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi); // 显示闹铃设置成功的提示信息 Toast.makeText(AlarmTest.this, "闹铃设置成功啦" , Toast.LENGTH_SHORT).show(); } }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime .get(Calendar.MINUTE), false).show(); } }); } }闹钟界面:
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.media.MediaPlayer; import android.os.Bundle; /** * Description: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Yeeku.H.Lee [email protected] * @version 1.0 */ public class AlarmActivity extends Activity { MediaPlayer alarmMusic; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载指定音乐,并为之创建MediaPlayer对象 alarmMusic = MediaPlayer.create(this, R.raw.alarm); alarmMusic.setLooping(true); // 播放音乐 alarmMusic.start(); // 创建一个对话框 new AlertDialog.Builder(AlarmActivity.this).setTitle("闹钟") .setMessage("闹钟响了,Go!Go!Go!") .setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 停止音乐 alarmMusic.stop(); // 结束该Activity AlarmActivity.this.finish(); } }).show(); } }关键的部分在于设置闹钟部分。aManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi); 到点时准时通过一个AlertDialog来提醒用户。这样一个基本的闹钟服务就完成了。
通过AlarmManager周期性的调用某个Service,从而实现更换壁纸的功能。
相关方法:
setBitmap(Bitmap bitmap):将壁纸设置bitmap所代表的位图。
setResource(int Resid):将壁纸设置resid所代表的图片
setStream(InputStream in):将壁纸设置in数据所代表的图片。
主界面:
import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class AlarmChangeWallpaper extends Activity { // 定义AlarmManager对象 AlarmManager aManager; Button start, stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); aManager = (AlarmManager) getSystemService( Service.ALARM_SERVICE); // 指定启动ChangeService组件 Intent intent = new Intent(AlarmChangeWallpaper.this, ChangeService.class); // 创建PendingIntent对象 final PendingIntent pi = PendingIntent.getService( AlarmChangeWallpaper.this, 0, intent, 0); start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 设置每隔5秒执行pi代表的组件一次 aManager.setRepeating(AlarmManager.RTC_WAKEUP , 0, 5000, pi); start.setEnabled(false); stop.setEnabled(true); Toast.makeText(AlarmChangeWallpaper.this , "壁纸定时更换启动成功啦", Toast.LENGTH_SHORT).show(); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { start.setEnabled(true); stop.setEnabled(false); // 取消对pi的调度 aManager.cancel(pi); } }); } }Service服务:
import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.IBinder;
public class ChangeService extends Service
{
// 定义定时更换的壁纸资源
int[] wallpapers = new int[]{
R.drawable.shuangta,
R.drawable.lijiang,
R.drawable.qiao,
R.drawable.shui
};
// 定义系统的壁纸管理服务
WallpaperManager wManager;
// 定义当前所显示的壁纸
int current = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
// 如果到了最后一张,系统重新开始
if(current >= 4)
current = 0;
try
{
// 改变壁纸
wManager.setResource(wallpapers[current++]);
}
catch (Exception e)
{
e.printStackTrace();
}
return START_STICKY;
}
@Override
public void onCreate()
{
super.onCreate();
// 初始化WallpaperManager
wManager = WallpaperManager.getInstance(this);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
记得在AndroidMainfest.xml文件中授予相应权限:
<user-permission android:name="android.permission.SET_WALLPAPER"/>