关于Service的一些理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35068744/article/details/78201636

关于Service的一些问题

一般来说,service已经总所周知了,但还是经常的看看,有助于对服务的更深的理解,每天复习,多学习一点对自己也是有很大的帮助

  • Service的生命周期
  • 面试时经常问到的关于Service的问题
  • Service常用的分类
  • 常用的生命周期的分类

Service的生命周期

Service的生命周期,因为比Activity的回调少一些,So:

  • onCreat
  • onStart
  • onDestory
  • onBind
  • onUnbind

生命周期常用的方法

一.手动调用:

  • StartService
  • StopService
  • bindService
  • unBindService

二.内部自动调用:

  • onCreat
  • onstartCommand(开始服务)
  • onDestory(销毁服务)
  • onBind(绑定服务)
  • onUnBind(解绑)
    private static final String TAG = "ContactService";
    private MyBinder mBinder = new MyBinder();
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate() executed");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand() executed");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy() executed");
    }

    /**
     * 用于和Activity建立关联的
     * @param intent
     * @return
     */
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    class MyBinder extends Binder {

        public void startDownload() {
            Log.d("TAG", "startDownload() executed");
            // 执行具体的下载任务
        }

    }

常用的生命周期的使用

  • 只使用startService启动
  • 只使用BindService启动
  • 同时使用StartService启动和BindService绑定

Service的分类

按照运行地点分类

  • 本地服务(需要依附于某个进程的服务 Eg:音乐)
  • 远程服务(系统级别的服务)

按照运行类型分类

  • 前台服务(服务使用时需要让用户知道且操作 Eg:音乐)
  • 后台服务(不需要让用户知道 Eg:天气更新,Date同步)

按照功能类型

  • 可通信服务
    1.启动在后台长期运行的服务,需要与Activity && Service进行通信,需要控制服务的开始时刻
    ⑴使用BindService启动
    ⑵第一次BindService时才会创建服务的实例并运行它,可以节约很多系统资源,特别是当服务是Remote Service时,会更明显。
    ⑶服务是公开一个接口,供客户端(Android||IOS远程调用)执行方法
    ⑷BroadcastReceiver也可以完成需求,But:如果交互的很频繁,容易造成性能问题,而且本身执行代码的时间非常短可能执行到一半,后面的代码便不会执行
    2.启动在后台长期运行的服务需要Activity&&Service通信,不需要控制服务开始,启动便开始运行
    ⑴使用BindService与StartService启动

面试时经常问到的关于Service的问题

  • service是否在main thread中执行,service里面是否能执行耗时的操作?

默认情况,如果没有service所运行的进程,Service和Activity是运行在当前app所在进程中的main thread里面
service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)
特殊情况,可以在清单文件中配置service所在的进程,让service在另外的进程中执行。

<service
android:name=""
        android:enabled="true"
android:process=":remote"
</service>

在Service中执行的耗时操作最多20秒,BroadcastReceiver是10秒,Activity是5秒。

  • Activity怎么和Service绑定,怎么在Activity中启动自己对应的Service?

Activity通过bindService(Intent service,ServiceConnection conn,int flags)跟Service进行绑定,当绑定成
功的时候ServiceService会将代理对象通过会调的方式传给conn,这样我们就拿到了Service提供的服务代理对象。
在Activity中可以通过startService和bindService方法启动Service。一般情况下如果想获取Service的服务对象
那么肯定需要bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可
以使用startService()方法。

  • IntentService简介

IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在的两个问题:
(1)Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中。
(2)Service也不是专门一条新的进程,因此不应该在Service中直接处理耗时的任务

  • IntentService特征

会创建独立的worker线程来处理所有的Intent请求
会创建独立的worker线程来处理OnHandlerIntent()方法实现的代码,无需处理多线程的问题
所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
为Service的onBind()提供默认实现,返回null
为Service的onStartCommand提供默认实现,将请求Intent添加到队列中

  • 什么是Service以及描述下他的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?

在Service的生命周期中,被回调的方法比Activity少一些只有onCreate(),onStart(),onDestroy(),onBind(),onUnbind()
通常有两种方式启动一个Service,它们对生命周期的影响是不太一样的。
(1)通过startService
Service会经历onCreate(),onStart(),然后处于运行状态,stopService()时候调用onDestroy方法
如果是调用者自己直接退出而没有调用stopService的haunted,Service会一直在后台运行
(2)通过bindService
Service会运行onCreate,然后调用onBind(),这时候调用者和Service绑定在一起。调用者退出了,Service就会调
用onUnbind->onDestroy方法
需要注意的是如果几个方法交织在一起
*一个原则是onCreate的方法只会被调用一次,就是你无论多少次的startService有bindService,Service只被创
建一次。
*如果先是bind了,那么start的时候就直接运行Service中onStart方法,如果先是start那么bind的时候就直接运
行onBind方法。
*如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法
的,service就stop不掉了,只能调用UnBindService,Service就会被销毁
*如果一个Service通过startService被start之后,多次调用startService的话,Service会多次调用onstart方法。

多次调用stopService的话,Service只会调用一次onDestroy方法。

*如果一个Service通过bindService被start之后,多次调用bindService的话,Service只会调用一次onBind方法

多次调用unBindService的话会抛异常。

面试题永远会更新,别总是去记忆,看遍天下码片,心中自然无码

Finally

多学习,多进步,每天进步一点

  • Welcome to the Android exchange group. Daniel is waiting for you 221348869(二群) 454430053(一群)

猜你喜欢

转载自blog.csdn.net/sinat_35068744/article/details/78201636
今日推荐