博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牢补基础,话说Service那点事
阅读量:6447 次
发布时间:2019-06-23

本文共 4829 字,大约阅读时间需要 16 分钟。

一、什么是Service?

Service通常总是称之为“后台服务”.

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。

此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。

其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件:

  • 1.并不依赖于用户可视的UI界面(当然,这一条其实也不是绝对的,如前台Service就是与Notification界面结合使用的);

  • 2.具有较长时间的运行特性。

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

  • 默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity 是运行在当前 app 所在进

    程的 main thread(UI 主线程)里面。

  • 2、service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )

    特殊情况,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行

    复制代码

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

  • Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行

    绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了
    Service 提供的服务代理对象。

  • 在 Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取

    Service 的服务对象那么肯定需要通过 bindService()方法,比如音乐播放器,第三方支付等。

  • 如果仅仅只是为了开启一个后台任务那么可以使用 startService()方法。

5、Service的生命周期考察的也挺多的

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

方法也不同。

非 绑 定 模 式

当 第 一 次 调 用 startService 的 时 候 执 行 的 方 法 依 次 为 onCreate() 、

onStartCommand(),当 Service 关闭的时候调用 onDestory 方法。

绑定模式

第一次 bindService()的时候,执行的方法为 onCreate()、onBind()解除绑定的

时候会执行 onUnbind()、onDestory()。

上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意 Service 实

例只会有一个,也就是说如果当前要启动的 Service 已经存在了那么就不会再次创建该 Service 当然也不会调用 onCreate()方法。

一个 Service可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该

Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户
都执行了 unBind()该 Service 也不会销毁。

一张图解决所有

InterService

作为一个老司机,如果连Interservice都没听说过,那就有点那个啥了

什么是 IntentService?有何优点?

我们通常只会使用 Service,可能 IntentService

对大部分同学来说都是第一次听说。那么看了

下面的介绍相信你就不再陌生了。如果你还是不了解那么在面试的时候你就坦诚说没用过或者不了解
等。并不是所有的问题都需要回答上来的。

什么是IntentService?

IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。

两个问题:

Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;

Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;

IntentService的特征

  • 会创建独立的 worker 线程来处理所有的 Intent 请求;

  • 会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;

  • 所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
  • 为 Service 的 onBind()提供默认实现,返回 null;
  • 为 Service 的 onStartCommand 提供默认实现,将请求 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 (UI Thread)。

7、Service 里面可以弹吐司么

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

用户。

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

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

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 的话会抛出异常。

更多文章

相信自己,没有做不到的,只有想不到的。

技术+职场

转载地址:http://xolwo.baihongyu.com/

你可能感兴趣的文章
数据库相关知识
查看>>
日志服务器设计
查看>>
Xshell生成密钥key(用于Linux 免密码登录)
查看>>
滑动到底部或顶部响应的ScrollView实现
查看>>
自己动手丰衣足食之征服jQuery插件编写
查看>>
基于业务单元的开发与部署模式
查看>>
第二代支付系统专题之报文篇(一)小额支付报文完整版(含二代新增功能业务说明)...
查看>>
非侵入式监控PHP应用性能监控分析
查看>>
LoadRunner 技巧之 脚本设计
查看>>
English Contest -- My English History
查看>>
CentOS挂载NTFS盘符问题
查看>>
Hadoop - Kylin On OLAP
查看>>
浅议javascript的内存泄露
查看>>
数据仓库专题(4)-分布式数据仓库事实表设计思考---讨论精华
查看>>
Nginx应用笔记(二)Nginx配置文件说明
查看>>
在Linux(Ubuntu)+Nginx安装配置AjaXplorer
查看>>
(八十九)txt文档的输入和输出
查看>>
openssl vulnerability affect PostgreSQLs
查看>>
使用ant编译发布web项目
查看>>
[经典面试题][百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B
查看>>