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:
*
网站: 疯狂Java联盟
*
Copyright (C), 2001-2014, Yeeku.H.Lee
*
This program is protected by copyright laws.
*
Program Name:
*
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文件中授予相应权限: