Service

作者: HOLLE_karry | 来源:发表于2020-08-23 21:04 被阅读0次

    1.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?(★★)

    •默认情况,如果没有显示的指 service 所运行的进程, Service 和 activity 是运行在当前 app 所在进程的 main thread(UI 主线程)里面。
    service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
    •特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行
    <service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" >
    </service>

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

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

    3.请描述一下 Service 的生命周期(★★★)

    Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同
    的使用方法生命周期方法也不同。

    绑定模式:当第一次调用 startService 的时候执行的方法依次为
    onCreate()、onStartCommand(),当 Service 关闭的时候调用 onDestory 方
    法。
    绑定模式:第一次 bindService()的时候,执行的方法为 onCreate()、onBind()解除绑定的时候会执行 onUnbind()、onDestory()。
    •上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还
    必须注意 Service 实例只会有一个,也就是说如果当前要启动的 Service 已经存在了那么就不会再次创建该 Service 当然也不会调用 onCreate()方法。
    •一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了
    onBind()方法后该 Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户都执行了 unBind()该 Service 也不会销毁。
    Service 的生命周期图如下所示,帮助大家记忆。

    service

    4.什么是IntentService?有何优点?(★★★)

    我们通常只会使用 Service,可能 IntentService 对大部分同学来说都是第一次听说。那么看了下面的介绍相信你就不再陌生了。如果你还是不了解那么在面试的时候你就坦诚说没用过或者不了解等。并不是所有的问题都需要回答上来的。

    一、IntentService 简介

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

    二、IntentService 特征

    •会创建独立的 worker 线程来处理所有的 Intent 请求;
    •会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;
    •所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
    •为 Service 的 onBind()提供默认实现,返回 null;
    •为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;
    •使用 IntentService本人 写了 一个 IntentService 的使 用例 子供参 考。 该例子 中一个MainActivity 一个 MyIntentService,这两个类都是四大组件当然需要在清单文件中注册。这里只给出核心代码:

    MainActivity.java:
    MyIntentService.java
    public void click(View view){
        Intent intent = new Intent(this, MyIntentService.class);
        intent.putExtra("start", "MyIntentService");
        startService(intent);
    }
    
    public class MyIntentService extends IntentService {
        private String ex = "";
        private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg){
            Toast.makeText(MyIntentService.this, "-e " +ex,Toast.LENGTH_LONG).show();
        }
    };
    public MyIntentService(){
        super("MyIntentService");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        ex = intent.getStringExtra("start");
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    protected void onHandleIntent(Intent intent) {
    /**
    * 模拟执行耗时任务
    * 该方法是在子线程中执行的,因此需要用到 handler 跟主线程进行通信
    */
        try{ 
        Thread.sleep(1000);
        } catch (InterruptedException e){ 
        e.printStackTrace();
        }
    mHandler.sendEmptyMessage(0);
        try{
        Thread.sleep(1000);
        } catch (InterruptedException e){
         e.printStackTrace();
        }
    }
    }
    

    5.说说Activity、Intent、Service 是什么关系

    他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是
    Android 四大组件之一。他俩都是Context 类的子类ContextWrapper 的子类,
    因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领,Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。Activity 和 Service 之间可以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。

    6.Service 和 Activity 在同一个线程吗(★)

    对于同一 app 来说默认情况下是在同一个线程中的,main Thread (UIThread)。

    7.Service 里面可以弹吐司么(★)

    可以的。弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就
    是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。比如我们在
    Service 中完成下载任务后可以弹一个吐司通知用户。

    8.什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有什么区别,怎样停用Service?(★★★)

    在 Service 的生命周期中,被回调的方法比 Activity 少一些,只有 onCreate,
    onStart, onDestroy,onBind 和 onUnbind。
    通常有两种方式启动一个 Service,他们对 Service 生命周期的影响是不一样的。
    •1. 通 过 startService
    Service 会经历 onCreate 到 onStart,然后处于运行状态,stopService
    的时候调用 onDestroy 方法。
    如果是调用者自己直接退出而没有调用 stopService 的话,Service 会一直
    在后台运行。
    •2. 通 过 bindService
    Service会运行onCreate,然后是调用onBind,这个时候调用者和Service
    绑定在一起。调用者退出了,Srevice 就会调用 onUnbind->onDestroyed 方
    法。
    所谓绑定在一起就共存亡了。调用者也可以通过调用 unbindService 方法来
    停止服务,这时候 Srevice 就会调用 onUnbind->onDestroyed 方法。
    需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?
    一个原则是 Service 的 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只会调用一次 onDestroyed 方法。
    如果一个 service 通过 bindService 被 start 之后,多次调用 bindService
    的话,service 只会调用一次 onBind 方法。
    多次调用 unbindService 的话会抛出异常。

    9.在 service 的生命周期方法onstartConmand()可不可以执行网络操作?如何在service 中执行网络操作?

    可以直接在 Service 中执行网络操作,在 onStartCommand()方法中可以执行网络操作

    相关文章

      网友评论

          本文标题:Service

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