Android-Service

Service是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互而且还要求长期运行的任务

创建Service

创建一个MyService类继承自Service,并重写onBind()方法

1
2
3
4
5
6
7
8
9
public class MyService2 extends Service {
public MyService2() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}

在清单文件中注册Service类

android:exported; 是否允许其他应用隐式调用该组件
android:enabled; 是否可以被系统实例化

1
2
3
4
5
<service
android:name=".MyService2"
android:enabled="true"
android:exported="true">
</service>

Service生命周期

1
2
3
4
5
6
7
8
//启动服务
startService()
//关闭服务
stopService()
//绑定服务
bindService()
//解绑服务
unbindService()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService2 extends Service {
private final String TAG = "xin";

@Override
// Service第一次被创建时调用
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate()");
}

@Override
// startService()启动时调用
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}

@Override
// Service不再使用时调用
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy()");
}

@Override
// 必须实现的方法,返回一个绑定的接口给Service
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind()");
return null;
// throw new UnsupportedOperationException("Not yet implemented");
}

@Override
// 解绑服务
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind()");
return super.onUnbind(intent);
}
}

启动Service

通过startService()启动

启动状态:
    当应用组件通过调用startService()启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无期限运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务,已启动的服务通常是执行单一操作,而且不会将结果返回给调用方

  1. 启动时,依次调用onCreate -> onStartCommand
  2. 如果Service已经被启动,再次启动时将不会执行onCreate,而是直接执行onStartCommand
  3. stopService时直接进入onDestory
  4. 无论调用了几次startService,一次stopService就能结束该Service
1
2
3
4
5
  Intent intent = new Intent(MyService.this,MyService2.class);
// 启动服务
startService(intent);
// 停止服务
stopService(intent);

通过bindService()启动

绑定状态:
    当应用组件通过调用bindService()启动服务时,服务即处于“绑定”状态。绑定服务提供了一个端口—服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可以同时绑定到该服务,但全部取消绑定时,该服务即会销毁

  1. 启动时只运行onCreate()
  2. 停止时,依次调用onUnbind -> onDestory
  3. 当与之绑定的Activity被销毁时自动解绑Service

Activity与Service绑定需要实例化一个ServiceConnection坐桥梁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//  通过一个桥梁给Activity和Service进行绑定
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
// 传送在service的onBind()中返回的IBinder
public void onServiceConnected(ComponentName name, IBinder service) {

}

@Override
// Service被不正常kill时调用
public void onServiceDisconnected(ComponentName name) {

}
};

绑定Service

1
2
3
4
5
//  绑定服务,传入 intent、ServiceConnection、绑定模式
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

// 解绑服务
unbindService(serviceConnection);