以下链接来自简书大佬
Android 四大组件:一份全面 & 简洁的 Service 知识讲解攻略
Android:Service生命周期 完全解析
Android Service startForeground不显示Notification的办法
Perceptible:可感知的
Android的四大组件之一,也有生命周期回调函数。
作用:提供需在后台长期运行的服务
应用场景:复杂计算、音乐播放、下载等
Service分类
Android:(本地、可通信的、前台、远程)Service使用全面介绍
按运行地点
- 本地服务
Local Service
运行在主线程。 主进程被终止,服务也会被终止。需要依附某个进程,如音乐播放器。 - 远程服务
Remote Service
独立的服务,相当于系统级别的服务。常驻后台,不受activity的影响。
按运行类型
- 前台服务
前台Service
在下拉通知栏有显示通知,但后台Service
没有.
前台Service优先级较高,不会由于系统内存不足而被回收;后台Service优先级较低,当系统出现内存不足情况时,很有可能会被回收 - 后台服务
按功能分
- 可通信的后台服务
activity代码
// 绑定服务
fun startService(view: View) {
// startService(Intent(this, TestService::class.java))
bindService(Intent(this, TestService::class.java), mServiceConnection2, Context.BIND_AUTO_CREATE)
}
// 解除绑定
fun stopService(view: View) {
// stopService(Intent(this, TestService::class.java))
unbindService(mServiceConnection2)
}
// 服务链接的监听
private val mServiceConnection2 = object : ServiceConnection{
private var myBinder: TestService.MyBinder? = null
override fun onServiceDisconnected(name: ComponentName?) {
}
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
myBinder = service as TestService.MyBinder
// 绑定成功
myBinder!!.sayHello()
}
}
Service端代码
public class TestService extends Service {
private static final String TAG = TestService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy()");
super.onDestroy();
}
@Nullable
@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);
}
public class MyBinder extends Binder {
public void sayHello() {
Log.d(TAG, "hello world");
}
}
}
完整的生命周期.png
可以看到,通过bindService绑定服务,并未走onStartCommand()方法。
多次绑定,也不会走任何一个生命周期方法。
解除绑定或者所依赖的activity销毁,会走
解除绑定.png
- 不可通信的后台服务
重要概念
进程和线程的区别
IPC
AIDL
<!--
android:exported 代表是否能被其他应用隐式调用
android:name 对应Service的类名
android:process 是否需要在单独的进程中运行,当设置为android:process=”:aidl”时,
代表Service在单独的进程中运行。进程名为<app-packagename:aidl>
"com.junl.interview4android:aidl"
-->
<service
android:name=".service.MyAidlService"
android:enabled="true"
android:exported="true"
android:process=":aidl" />
网友评论