public class MyService extends Service {
private static final String TAG = "qwe";
private Iprint iprint;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return new MyBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind");
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG, "onStart");
}
public void printLog() {
Log.d(TAG, "activity 调用 service 的方法");
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
/**
* 绑定服务后,由MyBinder调用service中的方法,onBind()返回MyBinder对象
*/
class MyBinder extends Binder implements Iprint {
/**
* 实现接口,调用服务中的方法,传到activity中,实现activity间接调用service中的方法
*/
@Override
public void print() {
printLog();
}
}
}
打印日志,比较两种方式的不同:
sartService
10-14 19:51:01.127 32418-32418/com.bing.servicedemo D/qwe: onCreate
10-14 19:51:01.128 32418-32418/com.bing.servicedemo D/qwe: onStartCommand
10-14 19:51:01.128 32418-32418/com.bing.servicedemo D/qwe: onStart
stopService
10-14 19:52:25.076 32418-32418/com.bing.servicedemo D/qwe: onDestroy
bindService
10-14 19:52:48.573 32418-32418/com.bing.servicedemo D/qwe: onCreate
10-14 19:52:48.574 32418-32418/com.bing.servicedemo D/qwe: onBind
unbindService
10-14 19:53:36.760 32418-32418/com.bing.servicedemo D/qwe: onUnbind
10-14 19:53:36.761 32418-32418/com.bing.servicedemo D/qwe: onDestroy
混合启动顺序1
startService
bindService
unbindService
stopService
10-14 19:56:00.965 4721-4721/com.bing.servicedemo D/qwe: onCreate
10-14 19:56:00.966 4721-4721/com.bing.servicedemo D/qwe: onStartCommand
10-14 19:56:00.967 4721-4721/com.bing.servicedemo D/qwe: onStart
10-14 19:56:02.940 4721-4721/com.bing.servicedemo D/qwe: onBind
10-14 19:56:04.703 4721-4721/com.bing.servicedemo D/qwe: onUnbind
10-14 19:56:05.602 4721-4721/com.bing.servicedemo D/qwe: onDestroy
要想service与activity通信,必须用bindService绑定service,并且实现通信桥梁onBind(intent)方法
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return new MyBinder();
}
activity不能直接调用service中的方法
现在我们要用通信桥梁MyBinder中的方法调用Service中的方法,MyBinder是service的内部类,我们抽取出接口Iprint,由MyBinder实现接口中的方法(可以不写成接口,这里只是想以AIDL的形式来实现)
/**
* 绑定服务后,由MyBinder调用service中的方法,onBind()返回MyBinder对象
*/
class MyBinder extends Binder implements Iprint {
/**
* 实现接口,调用服务中的方法,传到activity中,实现activity间接调用service中的方法
*/
@Override
public void print() {
printLog();
}
}
在manifest中注册服务
<service android:name=".MyService">service>
接下来便是在activity中调用service中的方法
bindService绑定服务必须要实现ServiceConnection
class MyServiceConnection implements ServiceConnection {
/**
* MyService中MyBinder是Iprint的实现类,可以强转为Iprint(也必须强转为Iprint)
*
* @param name
* @param service service中onBind()方法返回的对象
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iprint = (Iprint) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
其中iprint由Iprint声明
private Iprint iprint;
调用service中的方法
iprint.print();