一、开启服务的方式:
1)startService
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
当然,还有关闭Service:
stopService(new Intent(MainActivity.this, MyService.class));
也可以在onStartCommand()方法内部调用stopSelf()方法,但是这样会导致每次调用onCreate()方法中的代码走完Service就会被销毁掉。
MyService里面重写onCreate() 、onDestroy() 、onStartCommand()方法,onBind() 方法是Service的抽象方法,暂时用不到。
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("myService is Created");
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("myService is Destroyed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("myService is onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
一般的生命周期:
onCreate
onStartCommand
onDestroy
当多次startService时MyService会跳过onCreate()方法,直接执行onStartCommand()方法。生命周期:
onCreate
onStartCommand
onStartCommand
onDestroy
startService创建的Service需要手动停止,在做完一次操作之后需要stopSelf(),so IntentService可以实现这种需求,创建自定义的Service,实现IntentService 并实现他的onHandleIntent()方法,当方法里面的代码执行完毕后就会自动调用onDestroy()。
2)bindService()
Intent intent = new Intent(MainActivity.this, MyService.class);
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
bindService(intent,connection,Context.BIND_AUTO_CREATE);
需要在MyService中创建一个binder对象,并在onBind()方法中返回创建的binder对象。
class MyBinder extends Binder{
}
MyBinder mBinder = new MyBinder();
在bindService()之后,其生命周期为:
onCreate()
onBind()
onUnbind()
onDestroy()
在MyService中自定义的MyBinder就是Service与activity进行信息交互的一个桥梁,在MyBinder类中定义方法,activity通过调用MyBinder中的方法将参数传递到activity中。
二、远程连接服务(跨进程通信):通过AIDL(Android Interface Definition Language)
远程连接可参考:https://www.jianshu.com/p/34326751b2c6
本地创建远程服务客户端
1)创建AIDL文件
2)创建AIDL.Stub的实现类
3)在自定义的Service中添加实现类对象并在onBind()中返回该对象
4)binfService(),在ServiceConnection的实现方法中操作。
连接远程服务器 Service:
1)将服务器AIDL文件夹复制到本地,不做修改
2)Manifests中注册Service
3)开启服务(通过action和package实现)
例:
//参数与服务器端的action要一致,即"服务器包名.aidl接口文件名"
Intent intent = new Intent("scut.carson_ho.service_server.AIDL_Service1");
//Android5.0后无法只通过隐式Intent绑定远程Service
//需要通过setPackage()方法指定包名
intent.setPackage("scut.carson_ho.service_server");
//绑定服务,传入intent和ServiceConnection对象
bindService(intent, connection, Context.BIND_AUTO_CREATE);
参考:https://www.jianshu.com/p/34326751b2c6