在阿杰的上一篇博文中给大家讲了一下Android四大组件之一的Activity,也是最重要的,这一篇文章,给大家讲一下Service。
什么是Service
Service是Android的四大组件之一应用广泛,它是一个能在后台进行一个长时间的操作并且不提供用户界面的一个组件,应用相当广泛。其他应用组件可以启动Service,当用户切换到另一个应用程序时,Service依然可以在后台运行。
Service的作用
组件能够绑定到服务与之交互,甚至执行进程间通信(IPC)。
Service的生命周期
Service有自己的生命周期,它的生命周期方法比Activity少一些,只有onCreate()、onStartCommand()、onDestroy()。
Service的启动方式以及生命周期
1、通过startService()启动服务
- onCreat() --------当服务第一次创建的时候,优先调用onCreat()方法,然后在调用onStartCommand()方法,如果说,服务已经启动,再次调用startService()则不会调用onCreat()方法,直接调用onStartCommand(),onCreat()主要用来做一些初始化的操作。
- onStartCommand() -----------执行一次startService(),就会执行一次onStartCommand(),这个方法很重要,我们在服务进行的后台操作,比如下载音乐等等,都是在这个方法中进行。
- onBind() --------Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。
- onDestory() --------在销毁的时候会执行Service的该方法。
2、通过bindService启动Service
bindService启动服务的特点:
- 可以绑定多个组件到Service,比如几个Activity
- Activity可以通过IBinder接口来获取Service的实例,从而调用Service中的方法进行交互,通过StartService()启动Service则不能这样
- 某个组件(Activity)与Service绑定后,当Activity销毁时自动与Service解除绑定,Activity也可以调用UnBindService主动解除绑定。当没有组件与Service绑定时,Service自动销毁。
- 通过bindService启动Service不会调用onStartCommand()方法。
我们来测试一下,我们写一个Service:
public class MyService extends Service {
private final static String TAG = "Service_Text-----";
/**
* 创建MyBind,通过getMyService()获取Service实例
*/
public class MyBind extends Binder {
public MyService getMyService() {
return MyService.this;
}
}
/**
* 实例化MyBind
* 通过myBind实现Activity与Service之间的通信
*/
MyBind myBind = new MyBind();
/**
* @param intent
* @return 在onBind中返回MyBind
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return myBind;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind: " + intent.getStringExtra("activity"));
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: MyService" );
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: "+ intent.getStringExtra("activity"));
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: MyService" );
}
}
在写两个Activity ,ActivityA ActivityB
public class ActivityA extends AppCompatActivity implements View.OnClickListener {
private final static String TAG = "Service_Text-----";
private Service mService = null;
private boolean isBind = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
findViewById(R.id.btn4).setOnClickListener(this);
}
/**
* 绑定Service后,会执行ServiceConnection,可以通过onServiceConnected中的IBinder获取Service实例
*/
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
isBind = true;
MyService.MyBind myBind = (MyService.MyBind) service;
//获取Services实例
mService = myBind.getMyService();
Log.d(TAG, "onServiceConnected: ------------------------Activity A");
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBind = false;
Log.d(TAG, "onServiceDisconnected: ------------------------Activity A");
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
//绑定Service
Intent intent = new Intent(this, MyService.class);
intent.putExtra("activity", "Activity_A");
Log.d(TAG, "Activity A------执行了bindService");
bindService(intent, serviceConnection, BIND_AUTO_CREATE);
break;
case R.id.btn2:
if (isBind) {
Log.d(TAG, "Activity A------unbindService");
unbindService(serviceConnection);
}
break;
case R.id.btn3:
Intent intent1 = new Intent(this, ActivityB.class);
startActivity(intent1);
Log.d(TAG, "Activity A------跳转到了B");
break;
case R.id.btn4:
finish();
Log.d(TAG, "Activity A------结束");
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "ActivityA - onDestroy");
}
}
public class ActivityB extends AppCompatActivity implements View.OnClickListener{
private final static String TAG = "Service_Text-----";
private Service mService = null;
private boolean isBind = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setVisibility(View.GONE);
findViewById(R.id.btn4).setOnClickListener(this);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
isBind = true;
MyService.MyBind myBind = (MyService.MyBind) service;
//获取Services实例
mService = myBind.getMyService();
Log.d(TAG, "onServiceConnected: ------------------------Activity B");
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBind = false;
Log.d(TAG, "onServiceDisconnected: ------------------------Activity B");
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
//绑定Service
Intent intent = new Intent(this, MyService.class);
intent.putExtra("activity", "Activity_B");
Log.d(TAG, "Activity B------执行了bindService");
bindService(intent, serviceConnection, BIND_AUTO_CREATE);
break;
case R.id.btn2:
if (isBind) {
Log.d(TAG, "Activity B------unbindService");
unbindService(serviceConnection);
}
break;
case R.id.btn4:
finish();
Log.d(TAG, "Activity B------结束");
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "Activity B - onDestroy");
}
}
OK,现在我们运行项目启动ActivityA
我们点击bindService,可以看到控制台的输出:
我们点击UnBindService按钮,控制台输出:
我们点击bindService后点击finish,控制台输出:
我们在Activity中bindService后在跳转到ActivityB,在ActivityB中bindService
我们在点击unBindService:
我们在ActivityB中点击bindService后点击finish:
这时我们回到ActivityA了,service还存在,我们在点击finish:
Service销毁了
测试总结
经过上述的测试,我们来总结一下,当我们通过bindService绑定Service后,Service启动,并且会回调onServiceConnected()方法,我们可以通过这个回调获取到Service实例从而进行一些Service里面的操作。Service可以绑定多个Activity,连续多次调用bindService除第一次外其他绑定操作则没有任何方法执行(因为已经是绑定状态,不会重复绑定)。第一个绑定Service时,因为Service是首次绑定,所以Service会执行onCreat()方法,然后onBind(),onServiceConnected(),而后面的Activity执行BindService的时候,Service只会执行onServiceConnected()。当Activity与Service解除绑定是,会调用onUnBind(),当Service没有绑定的Activity时,会执行onUnBind(),OnDestory()。