service用于在后台处理耗时操作
目录
1、service创建:
2、service的三种启动方式:
3、在绑定操作中实现对服务的监听
4、应用外服务的启动
1、service创建:
- 创建一个类继承android.app.Service类,实现其抽象方法
- 在AndroidManifest文件中aplication标签配置Service
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
2、service的三种启动方式:
(1)startService:启动服务,独立于activity在后台保持运行,不受activity生命周期影响
生命周期:startSerevice()→onCreate()→ onStartCommand()→onDestroy()
创建→启动→销毁
activity中service启动:startService(intent)
Intent intent=new Intent(MainActivity.this,MyService.class);
startService(intent);
service停止: stopService(intent)
Intent intent=new Intent(MainActivity.this,MyService.class);
stopService(intent);
注意:onCreate()方法只会在Service第一次被创建的时候调用,如果服务销毁了,则重新调用onCreate(),如果服务没有被销毁,重新开启创建的服务则不会执行onCreate()而直接调用onStartCommand()执行生命周期
(2)BindService:绑定服务 服务创建,并未开启,不会引起服务在后台运行,随activity销毁而销毁,通常用来对service执行的任务进行进度监控
生命周期: bindService()→onCreate()→ onBind()→onUnbind()→onDestroy()
创建→绑定→解绑→销毁
activity中service启动:bindService()→ onBind()→ onServiceDisconnected()
Intent intent=new Intent(MainActivity.this,MyService.class);
ServiceConnection serviceConnection= new ServiceConnection() {///用于绑定客户端和服务
@Override
public void onServiceConnected(ComponentName name, IBinder service) {//当客户端和服务连接正常时,执行绑定操作会被调用
}
@Override
public void onServiceDisconnected(ComponentName name) {//当绑定的客户端和服务正常连接丢失时会被调用
}
};
//绑定
bindService(intent,serviceConnection ,BIND_AUTO_CREATE);
service停止: unbindService(serviceConnection)
unbindService(serviceConnection);
注意:onBind()只会在第一次绑定服务的时候后调用,需要通过onUnbind()方法解除绑定才能再次实现服务绑定,且解除绑定后,重新绑定不会在调用onBind()方法,再次解除绑定也不会调用onUnbind()方法,再次绑定只会执行ServiceConnection里的方法,条件是Service里的IBinder onBind(Intent intent)方法返回一个 IBinder()对象,为了避免复杂对 IBinder()所有接口实现,可以直接返回一个Binder()对象, Binder类实现了IBinder()所有接口
public IBinder onBind(Intent intent) {
// Binder类实现了IBinder()所有接口
// 因此可以返回一个Binder类
/* return new IBinder() {
@Override
public String getInterfaceDescriptor() throws RemoteException {
return null;
}
@Override
public boolean pingBinder() {
return false;
}
@Override
public boolean isBinderAlive() {
return false;
}
@Override
public IInterface queryLocalInterface(String descriptor) {
return null;
}
@Override
public void dump(FileDescriptor fd, String[] args) throws RemoteException {
}
@Override
public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
}
@Override
public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
return false;
}
@Override
public void linkToDeath(DeathRecipient recipient, int flags) throws RemoteException {
}
@Override
public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
return false;
}*/
return new Binder();
}
(3)startService(intent)+BindService():
通过BindService()创建的服务并未运行,运行需要通过startService(intent)方法实现服务启动运行
如果先startService(intent),然后BindService(),必须要先解除绑定服务,才能执行onDestroy()方法进行服务销毁
执行顺序:
startService()→onCreate()→ onStartCommand()→onBind()→onUnbind()→onDestroy()
注意:若创建服务→绑定,没有解绑,重新开启创建的服务,只会执行 onStartCommand()方法,重新绑定和解绑都不会执行onBind()和onUnbind(),除非是执行了onDestroy()然后重新创建服务,只会执行ServiceConnection类里的方法
- onServiceConnected():执行服务的绑定操作,当客户端正常连接服务时,会被调用
- onServiceDisconnected(): 当客户端正常连接丢失时调用
private ServiceConnection serviceConnection= new ServiceConnection() {//用于绑定客户端和服务
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {//当客户端正常连接服务时,执行服务的绑定操作会被调用
}
@Override
public void onServiceDisconnected(ComponentName name) {//当客户端正常连接丢失时调用
}
};
3、在绑定操作中实现对服务的监听
- 在Service内部,自定义一个内部类,继承Binder类
//自定义一个内部类,继承Binder类
class MyBinder extends Binder{
//定义自己的方法
int getProcess(){
return i;
}
}
- 将 IBinder onBind(Intent intent)方法的返回值改为该自定义的类
return new Binder()→ return new MyBinder();
4、应用外服务的启动
(1)为service添加一个意图过滤器和别名
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.kmust.action.My_Service"/>
</intent-filter>
</service>
(2)应用外的activity中对其它服务的操作
开启、绑定、解绑、关闭服务操作大同小异,只是intent传入的参数不同
Intent intent=new Intent("com.kmust.My_Service");
intent.setAction("com.kmust.My_Service");//service的action名字
intent.setPackage("com.moxuan.test");//service所在的包名
//开启服务
startService(intent)
//绑定服务
bindService(intent,serviceConnection ,BIND_AUTO_CREATE)
//解绑服务
unbindService(serviceConnection)
//停止服务
stopService(intent)
注意:setAction()传入的service的action名字和setPackage()传入的service所在的包名一定要对应一致,否则无法开启服务