一、认识Service
它是在后台运行,不可交互的一个东西,不能自己运行,需要通过某一个Activity或者其它的Context对象来调用,如Context.startService()和Context.bindService()二种方式启动Service。
需要说明的是:如果在Service的onCreate()或者onStart()方法里面做一些很耗时的动作,最好是启动一个新线程来运行这个Service。因为如果Service是运行在主线程中,会影响程序的UI操作或者阻塞主线程中的其它事情。
应用场景:播放多媒体的时候用户启动了其它Activity,这个时候程序要在后台继续播放;检测SD卡上文件的变化等等。
二、Service的生命周期
1、通过startService启动
onCreate->onStart->onDestroy。
如果是调用者自己直接退出而没有调用stopService,Service会一直在后台运行。
2、通过bindService启动
只会运行onCreate,这个时候调用者和Service绑定在一起,如果调用者退出了,Service就会调用onUnbind->onDestroy,和绑定者一起退出。
3、如果这几个方法交织在一起
一个原则是Service的onCreate方法只会被调用一次,就是无论多少次的启动或者绑定,Service只被创建一次。
如果是先绑定了,就停止不掉,也就是StopService不能用了,只能先UnbindService,再StopService,所以是先启动还是先绑定,是有区别的。
三、可以通过以下示例来验证:
先写一个Service:
public class ServiceDemo extends Service {
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind");
return null;
}
@Override
public void onCreate() {
System.out.println("onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStart");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnbind");
return super.onUnbind(intent);
}
}
再写一个调用者:
public class MainActivity extends Activity {
private Button btstart, btstop, btbind, btunbind;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btstart = (Button) findViewById(R.id.bt_start);
btstop = (Button) findViewById(R.id.bt_stop);
btbind = (Button) findViewById(R.id.bt_bind);
btunbind = (Button) findViewById(R.id.bt_unbind);
btstart.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
startservice();
}
});
btstop.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
stopservice();
}
});
btbind.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
bindservice();
}
});
btunbind.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
unbindservice();
}
});
}
public void startservice(){
Intent i=new Intent(this,ServiceDemo.class);
this.startService(i);
}
public void stopservice(){
Intent i=new Intent(this,ServiceDemo.class);
this.stopService(i);
}
private Boolean isBound=false;
ServiceConnection conn=new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
}
public void onServiceConnected(ComponentName name, IBinder service) {
}
};
public void bindservice(){
Intent i=new Intent(this,ServiceDemo.class);
this.bindService(i, conn, Context.BIND_AUTO_CREATE);
isBound=true;
}
public void unbindservice(){
if(isBound){
unbindService(conn);
}
isBound=false;
}
}
未完待续……………………