四大组件之Service(二)

自信是向成功迈出的第一步--爱因斯坦


本讲内容: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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值