自信是向成功迈出的第一步--爱因斯坦
本讲内容:Service 服务组件
一、后台执行的定时任务
Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制。这两种方式都能实现类似的效果,但Timer不太适合用于那些需要长期在后台运行的定时任务。
二、Alarm机制的用法
主要借助AlarmManager类来实现的。通过调用Context的getSystemService()方法来获取实例的。然后调用AlarmManager的set()方法就可以设置一个定时任务了。set()方法接收三个参数,第一个参数指定AlarmManager的工作类型,有四种值可选:
ELAPSED_REALTIME
表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU。
ELAPSED_REALTIME_WAKEUP 表示让定时任务的触发时间从系统开机开始算起,但会唤醒CPU。
RTC
表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒CPU。
RTC_WAKEUP 表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒CPU。
使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数。
使用System.currentTimeMillis()方法可以获取到1970年1月1日0点至今经历时间的毫秒数。
第二个参数是定时任务触发的时间,以毫秒为单位。第三个参数是一个PendingIntent。
示例一: 每隔20秒打印当前
可以看到每隔20秒打印当前
下面是LongRunningService.java文件:(记得注册)
public class LongRunningService extends Service{
private static final String TAG="MainActivity";
public IBinder onBind(Intent intent) {
return null;
}
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable(){
public void run() {
//打印了当前的时间
Log.d(TAG, "executed at "+ new Date().toString());
}
}).start();
AlarmManager manager=(AlarmManager) getSystemService(ALARM_SERVICE);
int time=20*1000;//20秒
Long triggerAtTime=SystemClock.elapsedRealtime()+time;
Intent i=new Intent(this,AlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(this, 0, i, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
System.currentTimeMillis();
return super.onStartCommand(intent, flags, startId);
}
}
下面是AlarmReceiver.java文件:(记得注册)
public class AlarmReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
//构建一个Intent对象,然后去启动LongRunningService这个服务
Intent i=new Intent(context,LongRunningService.class);
context.startService(i);
}
}
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent(this,LongRunningService.class);
startService(intent);//启动服务
}
}
一旦启动LongRunningService,就会在onStartCommand()方法里设定一个定时任务,这样20秒后AlarmReceiver的onReceive()方法就将得到执行,然后我们再次启动LongRunningService,这样就形成了一个永久的循环。
Take your time and enjoy it