Service在Android运行在后台,它没有可视化界面,只是默默运行在后台。我们以一个后台定时器的例子清晰的说明Service的运行流程。
一、创建Service类
项目右键->New->Service新建一个名为Time人Service的Service。将自动在AndroidMainfest中声明Service。

二、Service生命周期

  • 打开刚刚新建的TimerService,实现了一个onBind的方法。我们可以重写Service的一些方法,深刻分析Service的生命周期。

  • 生命周期:
    ①onCreate->onStartCommand->onDestory。
    onCreate只有在服务创建的时候才会被调用,如果Service已经在运行中,这个方法将不会再被调用。
    过程:创建服务之后就会执行服务,onStartCommand中的执行代码可以执行多次。

    ②onBind->onUnbind。

    可见onBind方法的返回类型是IBinder,这是一个接口,是一个客户端-服务器接口,可以利用该接口实现Activity与Service之间的通信。

三、Service的启动

  • 启动方式有两种:startService和bindService。
    startService,从方法可见参数是一个Intent,那显而易见我们需要新建一个Intent,使得Activity与Service建立起联系。
    使用该方法调用Service的话直接就是调用Service的onCreate方法。那停止服务的话就是stopService。


    bindService,如下截图可见参数,分别是Intent,ServiceConnection和int类型的三个参数。根据感觉第一个Intent就是上面新建的Intent。第二个参数连接类就是实现Activity与Service之间的通信部分,第三个参数使用AS已经定义好的一个整形变量。BIND_AUTO_CREEATE。

    下面具体阐述一下第二个参数,因为其还会重写一些方法。

    从函数名可预见其就是Activity与Service之间建立起联系之后和断开联系之后所进行的一些操作。onServiceConnected函数的参数IBinder就是Service类中onBind方法所返回的IBinder。
    使用该方法调用Service的话它会先执行Service的onCreate方法,然后紧接着调用onBind方法。需要注意的是onBind调用之后只能通过onUnbind方法进行解绑,直接调用onDestory销毁是不行的。
    下面我们将直接使用bindService启动Service,介绍Activity与Service之间是如何进行通信的。startService是比较简单。

四、bindService启动服务,Activity与Service之间通信

  • 我们实现的是一个计时器服务,就是当用户浏览此页面五秒之后进行通知用户。首先我们先在onCreate或者onBind方法中实现计时服务。(使用Timer,具体比较简单,直接贴代码)。主要就是使用了Timer的一个方法,在服务开启5000ms的时候执行task中的代码。

    这里我们新建一个线程主要是服务默认会使用主线程,这样会影响正在运行的Activity的性能。

  • Activity给Service传值
    我们新建一个Binder的子类myBinder,并创建实例,使得onBind方法中返回该实例。同时在该子类中实现一些方法,这样Activity中onServiceConnected方法中的IBinder接口进行强转成我们的myBinder类,然后就可以调用myBinder中的一些方法了。例如setData方法,Activity给Service传值。
    Service端

    Activity端调用:

  • Service给Activity传值
    如果说我们只是在调用服务时传一个固定的值回来的话,我们也可以在myBinder中实现一个getData的方法,直接将值返回,但是我们是一个定时器,需要的是在五秒之后才返回,如果酱紫操作会造成message为空,因为onServiceConnected是在onBind执行时就会执行,onBind执行的时候提示语message还为空,只有在五秒时才会赋值给message。
    所以该如何操作呢?
    使用到回调机制。我们在Service中新建一个接口,该接口中定义给message赋值的抽象方法,在计时五秒之后主动暴露该接口。那Activity中就会重写该接口中的方法进行处理service送出来的提示语message。
    Service端:


    Activity端:(因为服务是在一个子线程中执行,不能在Activity主线程中贸然将值改变,使用消息队列处理机制。不然子线程可以修改主线程,酱紫很危险,也容易造成消息泄露的微危险)

预告:我们这个实现的是在一个进程中实现Service的调用,之后将会发布在不同进程中实现服务的调用,即在两个APP中调用。同样使用的是IBinder接口。

Android Studio四大组件之Service的更多相关文章

  1. Java乔晓松-android的四大组件之一Service(服务的绑定)

    android的四大组件之一Service(服务的绑定) 怎么绑定服务,又怎么解除服务,代码如下: MainActivity.java源码: package com.example.lesson14_ ...

  2. Android开发四大组件之Service(具体解释篇)

    Android开发之四大组件--Service 一.Service 简单介绍 Service是android系统中的四大组件之中的一个(Activity.Service.BroadcastReceiv ...

  3. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  4. Android深入四大组件(七)Service的绑定过程

    前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大 ...

  5. 【Android开发日记】之入门篇(五)——Android四大组件之Service

    这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...

  6. Android 四大组件之 Service(一)

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  7. Android深入四大组件(六)Service的启动过程

    前言 此前我用较长的篇幅来介绍Android应用程序的启动过程(根Activity的启动过程),这一篇我们接着来分析Service的启动过程.建议阅读此篇文章前,请先阅读Android深入四大组件(一 ...

  8. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  9. Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)

    前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...

随机推荐

  1. android 布局之LinearLayout(学习一)

    一,View localView = mRadioGroup_content.getChildAt(i);指定自定义菜单栏的点击格,如child3 其中:mRadioGroup_content = ( ...

  2. 在 Windows 下用 TDM-GCC(MinGW)开发 DLL 涉及到数据同步锁及 DLL 初始化终止化函数的问题

    在 Windows 下用 TDM-GCC(MinGW)开发 DLL 如果要用到数据同步锁,理论上可以采用 Windows API 提供的临界区实现(需要用到的函数有 InitializeCritica ...

  3. 51 NOD 1406 and query

    我们知道一个数S会对所有它的子集S'产生1的贡献,但是我们直接枚举子集是 3^(log2 1000000)的,会炸掉:如果直接把每个有1的位变成0往下推也会凉掉,因为这样会有很多重复的. 但是我们发现 ...

  4. 模板题 Problem I Link Cut Tree

    @(XSY)[LCT] Description 你们这么轻松A了前两题,要是AK了我可就惨了,所以这道题一定要是难(shui)题.那出什么难题呢?有了,这样吧,第一题是数,第二题是树,那我就出个同时含 ...

  5. HTML5 这些你全知道吗?

    今天心情烦躁,搭建个论坛各种失败,Laravel.React也学不进去,于是就复习复习学过的.记录一下很少用的东西. 代码摘抄于W3C菜鸟教程HTML5手册 # 定义文本方向 <element ...

  6. UVa 10295 - Hay Points

    题目:有非常多工人.相应一个能力描写叙述表,每种能力有一个权值,求每一个工人的能力值. 分析:字符串.hash表,字典树.利用散列表或者字典树存储相应的单词和权值.查询就可以. 说明:注意初始化,计算 ...

  7. 生活娱乐 360安全卫士和QQ大战

    360安全卫士指控QQ侵犯用户隐私 [提要]9月26日晚上11点16分,安全软件商360在他们的论坛中发布了最新公告:<360安全卫士发布隐私保护器 专门曝光"窥私"软件&g ...

  8. 适合新人学习的iOS官方Demo

    UICatalog.包括了绝大部分经常使用的UI,入门必备良药. 9  分段选择器 10滑动条 Slider 11stack view 12 分步条 13 开关 14 textfield 15text ...

  9. Intel Edision —— 上电、基本设置与系统初探

    前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. Intel的文档其实挺清楚了,坛子上很多人把文档又详细复述一边,私以为一篇就够了其他的跟着文档走一遍也挺好的...俗一把使用过程顺手记录下来 ...

  10. Codeforces 486E LIS of Sequence(线段树+LIS)

    题目链接:Codeforces 486E LIS of Sequence 题目大意:给定一个数组.如今要确定每一个位置上的数属于哪一种类型. 解题思路:先求出每一个位置选的情况下的最长LIS,由于開始 ...