1、在Activity启动服务
public class ServiceActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent=new Intent(this,LongRunningService.class);
startService(intent);
}
}
2、在Service的onStartCommand()方法创建子线程用于执行具体的逻辑业务,使用AlarmService定时唤醒CPU
然后使用PendingIntent来发广播,广播接受者启动Service
public class LongRunningService extends Service{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//在子线程里可以执行具体的逻辑操作,简单起见,只是打印一下当前时间
Log.e("LongRunningSerivce","executed at"+new Date().toString());
}
}).start();
//通过getSystemService()获取AlarmManager的实例
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
//
int anHour=60*60*1000;//一小时的毫秒数
//开机至今的时间加上延迟执行时间
long triggerAtTime=SystemClock.elapsedRealtime()+anHour;
Intent i=new Intent(this,AlarmReceiver.class);
//调用getBroadcast()方法来获取一个能执行广播的PendingIntent
PendingIntent pi=PendingIntent.getBroadcast(this,0,i,0);
/*set()方法 第一个参数指定AlarmManager的工作类型
ELAPSED_REALTIME_WAKEUP表示让定时任务的触发时间从系统开机开始算起,会唤醒CPU
第二个参数 定时任务触发的时间 开机至今的时间加上延迟执行时间
第三个参数 调用getBroadcast()方法来获取一个能执行广播的PendingIntent
*/
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);
return super.onStartCommand(intent, flags, startId);
}
}
public class AlarmReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i=new Intent(context,LongRunningService.class);
context.startService(intent);
}
}