作者:半身风雪
上一节:一文看懂Activity
简介:在Android组件中最基本也是最为常见的四大组件:
- Activity
- Service服务
- Content Provider内容提供者
- BroadcastReceiver广播接收器
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。
Service 有的启动方式有两种:
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
这里需要先实现onBind方法,onBind() 是Service必须实现的方法,返回的IBinder对象相当于Service组件的代理对象,Service允许其他程序组件通过IBinder对象来访问Service内部数据,这样即可实现其他程序组件与Service之间的通信。
AndroidManifest.xml 清单文件中注册<!-- 组件必须要在清单文件里面注册-->
<service android:name=".MyService" />
public void onClick(View view) {
startService(new Intent(this, MyService.class));
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("MyService.onCreate service 启动成功");
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5m59fBu-1656317903225)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627153317992.png)]](https://1000bd.com/contentImg/2022/06/29/021422118.png)
通过该方式启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。
按上面的说法,即使访问者退出了,Service也仍然运行,那么我们该怎么结束呢?
我们在Activity 中,再添加一个停止按钮。
显式启动停止Service,需要将启动Service的Intent传递给stopService (Intent)函数。
public void onClickStop(View view) {
stopService(new Intent(this, MyService.class));
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("MyService.onDestroy service 停止");
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMq93Jje-1656317903226)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627154139464.png)]](https://1000bd.com/contentImg/2022/06/29/021422243.png)
上面我说startService 是显示启动,那么是不是还有对应的隐式启动呢?确实是有,但是从Android5.0开始,Google要求必须使用显示Intent启动Service,所以隐式启动咱就不介绍了。
public void onClickBindServiceStart(View view) {
bindService(new Intent(this, MyService.class), connection, Context.BIND_AUTO_CREATE);
}
参数说明:
onServiceConnected ()方法,当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法。private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
绑定启动中,当调用者通过bindService()函数绑定Service时,onCreate()函数和onBinde ( )函数将被先后调用。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuxRYgIQ-1656317903227)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627160254598.png)]](https://1000bd.com/contentImg/2022/06/29/021422421.png)
通过该方式启动Service,访问者与Service绑定在一起,访问者一旦退出了,Service也就终止了。
取消绑定仅需要使用unbindService()方法,并将ServiceConnnection传递给unbindService()方法
unbindService() 方法public void onClickUnBindService(View view) {
unbindService(connection);
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("MyService.onUnbind");
return super.onUnbind(intent);
}
当调用者通过unbindService()函数取消绑定Service时,onUnbind()函数将被调用。如果onUnbind()函数返回true,则表示重新绑定服务时,onRebind ()函数将被调用。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9J6DdVXe-1656317903228)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627160654791.png)]](https://1000bd.com/contentImg/2022/06/29/021422544.png)
需要注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()只会在意外断开绑定时才被调用。
这里别忘了在onDestroy() 销毁bindService
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P9oEAe5a-1656317903229)(/Users/tiger/Library/Application%20Support/typora-user-images/image-20220627161151540.png)]](https://1000bd.com/contentImg/2022/06/29/021422706.png)
onCreate() 当Service第一次被创建时,由系统调用。
onStartCommand() 当startService方法启动Service时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。
onCreate() 当Service被创建时,由系统调用。
onBind() 当bindService方法启动Service时,该方法被调用。
onUnbind() 当unbindService方法解除绑定时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。
注意:一个bindService可以创建多次,销毁多次,重复使用。