day33_安卓基础之service服务 (有总结)

  1. 服务的概念介绍

 

Activity, BroadcastReceiver , service, contentProvider

 

Service: 服务

 

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

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

 

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

 

第一步:

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

第二步:

到 清单文件中进行配置

第三步:

启动服务, 关闭服务

 

 

 

 

  1. 服务的快速入门

 

 

 

  1. 子线程

 

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

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

 

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

 

 

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

 

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

 

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

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

 

 

  1. android中进程的优先级

 

 

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

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

 

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

Android中的 进程的分类:

 

1.前台进程:

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

 

2.可视进程:

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

 

3.服务进程:

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

 

4.后台进程:

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

 

5.空进程:

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

 

 

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

 

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

 

 

  1. android中为什么要有服务

 

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

 

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

 

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

 

  1. 关于服务一些额外的内容

 

 

  1. 关于启动服务的生命周期

 

 

 

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

 

 

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

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

 

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

 

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

 

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

 

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

 

 

 

 

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

 

 

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

 

 

 

  1. 绑定服务的编写流程详解

 

  • 第一步:

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

     

     

第二步:

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

 

第三步:

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

 

第四步:

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

 

第五步:

在onBind方法中 , 返回 内线

第六步:

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

 

 

第七步:

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

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

 

第八步:

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

 

  1. 服务的生命周期一

 

 

 

 

 

 

 

 

  1. 服务的生命周期二

 

 

 

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

 

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

 

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

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

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

 

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

 

 

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

 

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

 

Oom和 memory leak?

 

 

 

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

 

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

 

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

 

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

 

  1. 混合开启服务介绍

 

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

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

 

 

混合开启服务:

 

开启服务

绑定服务

调用服务的方法

解绑服务

关闭服务

 

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

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

 

  1. 混合开启服务的实验演示

 

 

  1. 这段时间内容回顾一

 

 

  • 布局介绍 --- 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: 有界面的 组件

生命周期的方法

 

  • 广播接收者:BroadcastReceiver

OnReceive

 

 

系统有很多广播, 集成 BroadCastReceiver

 

 

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

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

 

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

 

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

 

 

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

 

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

 

  • 服务:

 

开启服务: startService

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

混合开启服务

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值