Android四大组件-Service

Service

独立启动

Context.startService(Intent service),和启动它的组件无关,有自己的生命周期,在后台一直运行直到运行完成或者别的组件关闭了它。

使用场景

  • 后台音乐播放
  • 后台下载
  • 常驻型服务

生命周期

  • onCreate()
  • onStartCommand(Intent, int, int)
  • onDestroy()

绑定启动

Context.bindService(Intent service, ServiceConnection conn,int flags),和启动它的组件绑定,可以与绑定它的组件之间长时间交互。

使用场景:

  • 前台音乐播放(UI更新)
  • 数据计算,需要随组件启动和销毁,需要交互。

生命周期

  • onCreate()
  • onBind(intent: Intent): IBinder
  • onUnbind(intent: Intent?): Boolean
  • onDestroy()

特性

  • 不需要直接和用户交互,被设计用于长时间的后台操作。需要在Manifest中进行注册。

  • 不是一个子线程。和别的组件一样运行在Main Thread中,耗时操作需要另起新现成或者使用IntentService,否则会造成ANR错误。

  • 不是一个单独的进程,除非特殊声明。

  • 可以通过startForeground()方法指定前台服务,高优先级,不会被系统杀掉。

  • 启动Service有两个额外的操作模式,设置方法为onStartCommand():的返回值:

    • START_STICKY代表需要明确的启动和停止。
    • START_NOT_STICKYorSTART_REDELIVER_INTENT代表没有明确的停止,会在后台一直运行。
  • 绑定启动具体实现:

    • 需要在service中定义IBinder的子类,用于组件与Service之间通信。(其实也就是类似一个回调接口,没有明确规定,可以写任何方法和属性)
    • 在启动Service的组件中,定义ServiceConnection,用于得到IBinder实例,以及连接成功和断开连接的回调方法。
    public class MService extends Service {
    
        private Notification mNotification;
    
        private class MyBinder extends Binder {
    
            void start() {
                Log.i("TAG", "startService");
            }
        }
    
        private MyBinder mMyBinder = new MyBinder();
    
        @Override
        public void onCreate() {
            super.onCreate();
            mNotification = new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.icon)
                    .build();
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return mMyBinder;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            //前台服务 高优先级
            startForeground(1, mNotification);
            //返回值决定额外的操作模式
            return START_STICKY;
        }
    }
    
  • 特殊用法

    • 需要和组件之间进行通信,但是又不希望在组件停止之后就停止运行先通过Context.startService()启动service再调用Context.bindService()进行绑定实现绑定独立运行的服务。

实际意义

  • Android中的后台操作主要分为两种:ThreadService。而Service又分为前台服务和后台服务。既然线程也能后台执行那还要服务来干嘛,这里就涉及到Android系统的优先级了。
    通常优先级排列如下:线程 < 后台服务 < 前台服务。因此需要后台操作具有一定稳定性时推荐使用服务,需要后台操作完全可靠时使用前台服务,对后台操作要求不高时使用线程。
  • 通常一个应用在系统层面就是一个进程,Android系统为每个进程分配的资源都是有限的,但是这不代表一个应用只允许存在单进程,在AndroidManifest.xml中,可以为四大组件配置android:process="xxx"来使该组件在新进程中运行。
    而跨进程通信IPC(Inter-Process Communication)是Service的强项,可以说才是Service存在的最重要的意义

你可能感兴趣的:(Android)