# android 开启服务

开启服务有两种方式:startServicebindService

首先在 AndroidManifest.xml 文件中声明

<service android:name=".MyService"/>
1

# startService 方式

public class MyService extends Service {
    private static String TAG = "MyService";
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind");
        return null;
    }
 
    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        super.onCreate();
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
 
    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy");
        super.onDestroy();
    }
}
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

启动服务:

//开启服务
Intent service = new Intent(this, MyService.class);
startService(service);

//结束服务
stopService(service);
1
2
3
4
5
6

开启服务时,调用一次 startService(),生命周期执行的方法依次是:onCreate() ==> onStartCommand();

调用多次 startService()onCreate() 只有第一次会被执行,而 onStartCommand() 会执行多次。

# bindService 方式

该方式需要一个 ServiceConnection 接口的实现类对象

MyServiceConnection.java:

public class MyServiceConnection implements ServiceConnection {
    private static String TAG = "MyServiceConnection";
    private MyService.MyBinder myBinder = null;

    // 连接初始化
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        myBinder = (MyService.MyBinder) service;
        myBinder.setMethod1('xxx');
    }

    // 方法1-自定义方法
    public void setMethod1(String str) {
        myBinder.setMethod1(str);
    }

    // 方法2
    public void setMethod2() {
        myBinder.setMethod2();
    }

    // 连接错误
    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.e(TAG,"onServiceDisconnected");
    }
}
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

MyService.java:

public class MyService extends Service {
    private static String TAG = "MyService";
    private MyBinder myBinder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    MainActivity _m = null;
    Boolean screening = false;
    public class MyBinder extends Binder {
        public void setMethod1(String str) {
            // 方法1执行代码
        }

        public void setMethod2() {
            // 方法2执行代码
        }
    }

    @Override
    public void onDestroy() {
        Log.i(TAG,"destroy");
        super.onDestroy();
    }
}
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

启动服务:

// 开启服务
Intent intent = new Intent(this, MyService.class);
MyServiceConnection conn = new MyServiceConnection();
bindService(intent, conn, BIND_AUTO_CREATE);

// 关闭服务
unbindService(conn);
conn = null;
1
2
3
4
5
6
7
8

bindService 开启服务,生命周期执行的方法依次是:

onCreate() ==> onBind() ==> onServiceConnected();

调用多次 bindService()onCreate()onBind() 都只在第一次会被执行,onServiceConnected() 会执行多次。

上次更新: 12/26/2021, 10:35:55 PM