美文网首页
Android基础之Service

Android基础之Service

作者: 城南一霸賈十七 | 来源:发表于2018-08-16 12:30 被阅读36次

以下链接来自简书大佬
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" />  

相关文章

网友评论

      本文标题:Android基础之Service

      本文链接:https://www.haomeiwen.com/subject/gxwrbftx.html