Service的生命周期语言描述
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy 我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate –> onStartCommand (onStart是过时的方法,新方法是onStartCommand )
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind–>onDestroyed
所谓绑定在一起就共存亡了。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
Service的生命周期demo
TestService.java
/**
* 启动服务的生命周期: onCreate()->onStartCommand()->onDestroy()->[shutdown]
*
* 绑定服务的生命周期: onCreate()->onBind()->onUnbind()->onDestroy()
*
* 注:Service类继承Context
*/
public class TestService extends Service {
/**
* 第一次startService的时候调用
*/
@Override
public void onCreate() {
Log.i("ziru", "服务创建onCreate");
super.onCreate();
}
/**
* 每次startService的时候都调用
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("ziru", "服务开启onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
/**
* 只有startService后执行onDestroy
*/
@Override
public void onDestroy() {
Log.i("ziru", "服务销毁onDestroy");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
private Button btnStart;
private Button btnStop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
btnStart = (Button) findViewById(R.id.btn_start);
btnStop = (Button) findViewById(R.id.btn_stop);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
Intent intent = new Intent(this, TestService.class);
startService(intent);
break;
case R.id.btn_stop:
Intent intent2 = new Intent(this, TestService.class);
stopService(intent2);
break;
default:
break;
}
}
}
main_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动服务" />
<Button
android:id="@+id/btn_stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止服务" />
</LinearLayout>
配置
<service android:name="com.example.testservice.TestService" />