初学_Android4高级编程-11 Service&AsyncTask&Alarm
※Service,运行时不可见,被设计为是长生命周期,特别用来执行一些持续性,可能耗时的操作
通过startService()启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了。通常started状态的service执行单任务并且不返回任何结果给启动者。比如当下载或上传一个文件,当这项操作完成时,service应该停止它本身。
还有一种“绑定”状态的service,通过调用bindService()来启动,一个绑定的service提供一个允许组件与service交互的接口,可以发送请求、获取返回结果,还可以通过跨进程通信来交互(IPC)。绑定的 service只有当应用组件绑定后才能运行,多个组件可以绑定一个service,当调用unbind()方法时,这个service就会被销毁了,service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
//事件处理
}
@Override
public void onCreate() {
super.onCreate();
//启动初始化
}
IBinder mBinder;
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
绑定一个Service
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//连接时调用
}
@Override
public void onServiceDisconnected(ComponentName name) {
//当Service意外断开时接收
}
};
Intent bindIntent = new Intent(this,MyService.class);
bindService(bindIntent,mConnection, Context.BIND_AUTO_CREATE);
※使用AsyncTask运行异步任务
AsyncTask task = new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
return null;
}
};
private class MyAsyncTask extends AsyncTask<String,Intent,String>{
@Override
protected String doInBackground(String... params) {
return null;
//在后台线程上执行,将运行事件长的代码放在这里,不能与UI交互
}
@Override
protected void onProgressUpdate(Intent... values) {
super.onProgressUpdate(values);
//在中间进度变化时与UI交互,更新进度
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//doInBackground完成后于UI交互
}
}
※使用Intent Service包装类
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。而在一般的继承Service里面如果要进行耗时操作就必须另开线程,但是使用IntentService就可以直接在里面进行耗时操作,因为默认实现了一个worker thread。对于异步的startService请求,IntentService会处理完成一个之后再处理第二个。
public class MyIntentService extends IntentService{
public MyIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
// 耗时任务在这里实现,传入的IntentService的每个Intent被逐个处理。
//全部处理后,该Service会终止他自己
long endTime = System.currentTimeMillis() + 5*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception ignored) {
}
}
}
}
}
※使用Alarm在预先确定的时间或时间间隔内激活Intent,和Timer不同,是在应用程序之外处理的。不需要打开或者运行应用程序,通过AlarmManager管理所有Alarm
//获取一个AlarmManager的引用
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//如果设备处于休眠状态,设置Alarm来唤醒
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
//10秒后触发设备
long timeOrLengthofWait = 10000;
//创建能够广播和操作的Pending Intent
String ALARM_ACTION = "ALARM_ACTION";
Intent intentToFire = new Intent(ALARM_ACTION);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this,0,intentToFire,0);
//设置Alarm
alarmManager.set(alarmType,timeOrLengthofWait,alarmIntent);
//重复的Alarm
alarmManager.setInexactRepeating(alarmType,timeOrLengthofWait,timeOrLengthofWait,alarmIntent);
浙公网安备 33010602011771号