服务的概念介绍

 

Activity, BroadcastReceiver , service, contentProvider

 

Service: 服务

 

服务最开始是 windows中 使用到的 ,

后来 android 出现的时候, 谷歌工程师, 也 模仿去 弄出了 服务.

 

服务: 实际上就是长期可以在后台运行的, 没有界面的, 运行在 当前的进程空间中的

 

第一步:

继承一个service 类 , 那么就写了 一个服务

第二步:

到 清单文件中进行配置

第三步:

启动服务, 关闭服务

 

 

 

 

服务的快速入门

 

android 中服务分类 安卓 服务_绑定服务

 

android 中服务分类 安卓 服务_绑定服务_02

 

android 中服务分类 安卓 服务_绑定服务_03

子线程

 

activity和service都能实现同样的功能,他们的区别是?

直接 开启服务,在服务中去干 超时的事, 会引发 应用程序 ANR (application not responding)

 

android 中服务分类 安卓 服务_应用程序_04

导致这种问题,是因为在主线程中干了耗时的事儿..

 

 

Service 是运行在主线程中的 ...

 

主线程中 是不允许干耗时的事儿的

 

Activity(默认的是 5 秒钟应用程序无响应那么 就会报 ANR ),

service (默认的是 10 秒钟应用程序无响应, 那么就会报ANR)

 

 

android中进程的优先级

 

android 中服务分类 安卓 服务_应用程序_05

 

Android 系统会尽可能的保持应用程序的进程 一致存在, 即使在应用退出了之后 也仍然 这样... 但是 如果发现内存不够用了,

要去启动 新的进程时, 那么会按照进程的优先级顺序 去 杀死 某些 老的进程 .

 

进程: 就是一块独立的内存空间,用来运行 程序的

Android中的 进程的分类:

 

1.前台进程:

android 中服务分类 安卓 服务_绑定服务_06

, 可以与用户直接进行交互的 , 就是前台进程 (可以获得焦点的)

 

2.可视进程:

android 中服务分类 安卓 服务_生命周期_07

, 可以看到, 但是不能直接与用户进行交互

 

3.服务进程:

android 中服务分类 安卓 服务_绑定服务_08

, 进程中 运行了一个服务. 在运行着

 

4.后台进程:

android 中服务分类 安卓 服务_android 中服务分类_09

, 例如, 一个activity 现在不可见了, 但是 在后台运行

 

5.空进程:

android 中服务分类 安卓 服务_绑定服务_10

一个进程中,没有服务, 也没有 activity, 整个 应用程序已经退出

 

 

重要优先级: 前台进程> 可视进程>服务进程> 后台进程> 空进程

 

服务可以长期后台运行, 是与 当前的 启动 服务的acitvity 是没有关系的.

 

 

android中为什么要有服务

 

一个activity退出后会变成一个空进程

 

在内存空间不够用的时候 ,首先清理掉空进程,但是服务进程被干掉后会自动恢复

 

保留进程是为了快速启动,一个进程实际上是一个Linux process

 

关于服务一些额外的内容

 

android 中服务分类 安卓 服务_android 中服务分类_11

 

关于启动服务的生命周期

 

android 中服务分类 安卓 服务_生命周期_12

 

android 中服务分类 安卓 服务_生命周期_13

 

点击 开启服务, 那么服务会 创建. 点击关闭服务器, 服务就 又 会销毁

 

 

服务 只会被创建一次调用oncreate , 多次开启服务, 只会去重复调用 onstartcommand , 并不会去新创建服务, 不会调用oncreate

服务也只会被关闭一次, 开启服务后 可以去关闭 服务, 会调用 ondestroy方法 销毁服务

 

直接使用启动服务调用服务中的方法弊端

 

结论:使用开启服务的方式 去调用服务中的方法 是 走不通的 , 调用不了 服务中的方法 ...

 

需要 使用 绑定服务 的方式 去调用 服务中的方法....

 

绑定服务调用服务中的方法

 

android 中服务分类 安卓 服务_android 中服务分类_14

android 中服务分类 安卓 服务_绑定服务_15

 

android 中服务分类 安卓 服务_应用程序_16

 

android 中服务分类 安卓 服务_应用程序_17

 

绑定服务实现的内部原理与代码对照

 

android 中服务分类 安卓 服务_绑定服务_18

 

上午的绑定服务实现的原理回顾&抽取接口去隐藏内线的其他的方法

 

android 中服务分类 安卓 服务_android 中服务分类_19

 

android 中服务分类 安卓 服务_生命周期_20

 

绑定服务的编写流程详解

 

  • 第一步: 在 服务中 去编写一个 要被 外面调用到的 方法

android 中服务分类 安卓 服务_应用程序_21

第二步:

在服务中提供一个 内线 ,这个内线是 继承了Binder类 实现了 IService接口的

android 中服务分类 安卓 服务_绑定服务_22

 

第三步:

编写一个IService接口 , 提供一个 方法

android 中服务分类 安卓 服务_应用程序_23

 

第四步:

进到 服务中 内线中, 在内线 里 实现接口的方法, 调用 服务中的 的方法

android 中服务分类 安卓 服务_android 中服务分类_24

 

第五步:

在onBind方法中 , 返回 内线

android 中服务分类 安卓 服务_绑定服务_25

第六步:

回到 屁民 activity中, 使用绑定服务的方式去 开启服务

android 中服务分类 安卓 服务_android 中服务分类_26

 

 

第七步:

编写 屁民 activity 和 服务的内线的通讯 频道

在通信频道的 serviceConnection的实现类 中 的onServiceConnected中 拿到 对 内线的引用

android 中服务分类 安卓 服务_应用程序_27

 

第八步:

通过 对内线的引用,去调用 service中的方法

android 中服务分类 安卓 服务_android 中服务分类_28

 

服务的生命周期一

 

android 中服务分类 安卓 服务_android 中服务分类_29

 

android 中服务分类 安卓 服务_应用程序_30

 

 

android 中服务分类 安卓 服务_绑定服务_31

 

android 中服务分类 安卓 服务_android 中服务分类_32

 

android 中服务分类 安卓 服务_绑定服务_33

 

android 中服务分类 安卓 服务_绑定服务_34

 

android 中服务分类 安卓 服务_android 中服务分类_35

服务的生命周期二

 

android 中服务分类 安卓 服务_绑定服务_36

 

android 中服务分类 安卓 服务_应用程序_37

 

断开连接的方法需要手动的去调用,但是不能像他说的那样吧 agent 置为null,因为agent还需要被调用

 

绑定服务完整的生命周期:

 

绑定服务: 调用 oncreate, onbind方法

调用服务中的方法-------

解绑服务: 调用 onunbind方法, 调用 ondestroy方法 服务销毁

 

绑定服务了之后 , 直接去解绑服务, 然后再去调用 服务中的方法 ..

 

 

绑定服务的时候, 如果 绑定服务的应用 退出了, 那么 服务也会 被销毁 ...

 

而 开启服务时, 如果 开启服务的 应用退出了, 但是 这个被开启的服务 仍然是 在 后台 运行的, 是一个后台的服务进程.

 

Oom和 memory leak?

android 中服务分类 安卓 服务_生命周期_38

 

android 中服务分类 安卓 服务_应用程序_39

 

 

关于绑定服务和开启服务的生命周期区别

 

绑定服务的时候, 如果 绑定服务的应用 退出了, 那么 服务也会 被销毁 ...

 

而 开启服务时, 如果 开启服务的 应用退出了, 但是 这个被开启的服务 仍然是 在 后台 运行的, 是一个后台的服务进程.

 

栗子: 今日头条监听自己的服务器有没有新的推送信息

 

混合开启服务介绍

 

绑定服务可以 调用 服务中方法 ---- 好处

开启服务 可以让服务在后台 一直运行-- 好处

 

 

混合开启服务:

 

开启服务

绑定服务

调用服务的方法

解绑服务

关闭服务

 

结论: 如果以后 需要去 在后台一直运行服务, 并且又想调用服务中的方法, 那么请 严格 按照 如上的 5 步 去走. 否则可以能会导致

一些 莫名其妙的问题...

 

混合开启服务的实验演示

 

android 中服务分类 安卓 服务_生命周期_40

 

这段时间内容回顾一

 

 

  • 布局介绍 --- 5 种 :

LinearLayout, RelativeLayout.

 

  • 单位:

Sp(字体大小) , dp ,dip (这两个是组件大小)

 

  • 点击事件的写法:

4 种 : 匿名内部类, 内部类, 让 activity直接实现 接口(View.onClickListener), 在控件中直接写onclick

 

  • 存储数据:
Sdcard(/mnt/sdcard), 应用程序 内部( /data/data/包名/files /cache ) , sharepreference(/data/data/包名/share_prefs),
数据库(/data/data/包名/databases) SQLite-----SQLiteOpenHelper

 

判断sd卡的状态 --- 控件 是否够用 
File 中 getFreeSapce, getTotalSpce 
 
Formatter----直接获得转换后的数据大小
 
 
getSharedPreference ---
 
 
SqliteOpenHelper --- oncreate , onupgrade(int oldVersion, int newVersion) 
 
• 
    xml解析 --- pullparser 
  
While(type!=Xml.END_CODUMENT){
 
type= parser.next();
} 
 
使用 serializer --- 使用 了 StringBuilder拼接 
 
• 
    JSON格式的数据: 
   两种格式: 
Json对象: {key:value,key:value}
Json数组: [value1,value2,value3]
 
[{},{},{}]
 
JsonArray, JsonObject
 • 
    listView(重要 ---mvc 的设计思想去设计的 ) 
  
 
v(xml , 视图 ), m(数据,模型), c( adapter,控制器 )
 
ListView显示的原理 
GetCount(), getView(); --- BaseAdapter 
 
listView优化 --- convertView ---- (卖烧瓶的故事托儿)
• 
    如何去访问网络 
  
URL- connection, 
 
Apache的HttpClient --- httpGet, httpPost 
 
开源的框架--- asyncHttpClient --- post, get ---- 完成文件的上传和下载 
 
 
• 
    主线程不能干耗时的事儿----- ANR 
  
NetWorkOnMainThreadException
 
 
Activity--- 5秒 没有任何响应就会 ANR
Service--- 10秒 没有任何响应会ANR 
 
• 
    开启子线程 去干耗时的事儿

 

Handler, Message, MessageQueue, Looper(ThreadLocal)

 

模版代码

 

  • 意图: 组件激活时, 都用的是意图

 

隐式意图:

显示意图:

 

Action --- data

 

  • Activity: 有界面的 组件

生命周期的方法

android 中服务分类 安卓 服务_android 中服务分类_41

 

  • 广播接收者:BroadcastReceiver

OnReceive

 

 

系统有很多广播, 集成 BroadCastReceiver

 

 

有序广播:可以取消,可以更改

无序广播:不可以取消,不可以更改

 

发短信, ip拨号 , 耳机的 按键 都是有序广播

 

获得短消息的 内容 --- pdu数据 -- 工业标准(拦截取消短信)

 

 

  • 有一些广播,必须要通过 代码去注册, 不能通过 xml 配置 实现 -- 电量, 屏幕解锁/锁屏

 

2.3 允许没有activity的应用获取短信,但是4.0 之后不允许,没有activity的应用不能获取

 

  • 服务:

 

开启服务: startService

绑定服务: bindService() ---- 办证

混合开启服务