1. 概要
Service是Android中实现程序后台运行的解决方案,它非常适合去执行不需和用户交互但是要求长期运行的任务。需要注意一下几点:
- 服务不是运行在一个独立的进程中,而是依赖于创建服务所在的应用程序进程;当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止。
- 服务并不会自动开启线程,代码默认运行在主线程中。也就是说,需要在服务的内部手动创建子线程,并在这里执行具体的任务。
2. Android多线程编程
- 在子线程中更新UI
Android不允许在子线程中进行UI操作,其提供了一套异步消息处理机制去解决在子线程中进行UI操作:
public class MainActivity extends Activity{
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case UPDATE_UI:
// todo
break;
}
}
}
@Override
...
new Thread(new Runnable(){
@Override
public void run(){
Message message = new Message();
message.what = UPDATE_UI;
handler.sendMessage(message);
}
}).start();
}
- 使用AsyncTask:异步执行
class Task extends AsyncTask<void, Integer, Boolean>{
protected void onPreExecute(){// 执行前}
// 程序执行在这里
protected Boolean doInBackground(){
// todo
publishProgress(...);
}
// 更新中
protected void onProgressUpdate(...){
// todo
}
// 执行完成
protected void onPostExecute(...){
// todo
}
}
3. 服务的使用
// 定义一个服务
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onCreate(){
// todo
}
@Override
public void onStartCommand(){
// todo
}
@Override
public void onDestroy(){
// todo
} ...
}
// Manfiest中定义
<service android:name=".MyService"></service>
// activity中服务启动停止
Intent intent = new Intent(this, MyService.class);
startService(intent);
stopservice(intent);
4. 活动和服务进行通信
// 1. 创建service
public class MyService extends Service{
private DownloadBinder mbinder = new DownloadBinder();
class DownloadBinder extends Binder{
public void Start(){ // todo }
public void getProgress(){ // todo }
}
@Override
public IBinder onBind(Intent intent){
return return mbinder;
}
}
//2. Activity中调用
public class MyActivity extends Activity{
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection(){
@Override
public void onServiceDisconnected(ComponentName name){}
@Override
public void onServiceConnected(ComponentName name, IBinder service){
downloadBinder = (MyService.DownloadBinder)service;
downloadBinder.start();
downloadBinder.getProgress();
}
@Override
public void click(){
...
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
unbindServce(connection);
}
}
}
网友评论