Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。Service是一个应用组件,能在后台执行长时间的操作,并且不提供用户界面;所以Service不是一个单独的进程也是不是一个线程。
项目中的每一个Service都必须在AndroidManifest.xml中注册才行。
Service生命周期:
从service的生命周期可以看出,从它被创建开始,到它被销毁为止,可以有两条不同的路径:
- startService():必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
- bindService():客户端可以通过一个IBinder接口和service进行通信。可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户端绑定,当多个客户端都解除绑定之后,系统会销毁service。
这两条路径并不是完全分开的,我们可以和一个已经调用了 startService()而被开启的service进行绑定。比如一个音乐播放器service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户端都解除绑定。
Service所要重写的方法:
- onCreate() :创建Service后会被调用
- onStartCommand(Intent intent, int flags, int startId)
- onDestroy() :Service关闭之前会调用的方法
onBind(Intent intent)
我们通过音乐播放器的例子来更深刻理解这些方法:
public class MusicService extends Service {
private MediaPlayer mediaPlayer;
private IBinder iBinder=new LocalBinder();
@Override
public void onCreate() {
super.onCreate();
mediaPlayer=MediaPlayer.create(this,R.raw.dongting);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer.start();
return START_NOT_STICKY;//在后台强制关闭时可以杀死
}
@Override
public void onDestroy() {
mediaPlayer.stop();
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
public class LocalBinder extends Binder{
MusicService getService(){
return MusicService.this;
}
} }
上面onBind()方法返回了一个可以得到歌曲的Binder对象,该对象将会传给访问该Service的访问者。
public class MusicActivity extends Activity implements View.OnClickListener{ private Button startbtn; private Button stopbtn; private MusicService musicService; private ServiceConnection serviceConnection=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //ibender负责service与外界通信,ibender是从MusicService的onBind()方法中得到的 MusicService.LocalBinder localBinder= (MusicService.LocalBinder) iBinder; musicService = localBinder.getService(); } @Override public void onServiceDisconnected(ComponentName componentName) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.music_button); startbtn = (Button) findViewById(R.id.music_btn_start); stopbtn = (Button) findViewById(R.id.music_btn_stop); startbtn.setOnClickListener(this); stopbtn.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.music_btn_start: startService(new Intent(MusicActivity.this,MusicService.class)); bindService(new Intent(MusicActivity.this,MusicService.class),serviceConnection,BIND_AUTO_CREATE); //要在ManiFest中添加service标签 break; case R.id.music_btn_stop: unbindService(serviceConnection); stopService(new Intent(MusicActivity.this,MusicService.class)); break; } } }
IntentService:异步处理服务
Service运行在主线程里,所以它里面不能处理一个耗时操作,否则会报出异常。
IntentService的特点:
IntentService有以下特点:
(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4) 默认实现的onBind()返回null
(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中
有关更多的IntentService的内容,大家可以看看以下相关资料:
http://www.cnblogs.com/zhangs1986/p/3602154.html