服务的概念介绍
Activity, BroadcastReceiver , service, contentProvider
Service: 服务
服务最开始是 windows中 使用到的 ,
后来 android 出现的时候, 谷歌工程师, 也 模仿去 弄出了 服务.
服务: 实际上就是长期可以在后台运行的, 没有界面的, 运行在 当前的进程空间中的
第一步:
继承一个service 类 , 那么就写了 一个服务
第二步:
到 清单文件中进行配置
第三步:
启动服务, 关闭服务
服务的快速入门
子线程
activity和service都能实现同样的功能,他们的区别是?
直接 开启服务,在服务中去干 超时的事, 会引发 应用程序 ANR (application not responding)
导致这种问题,是因为在主线程中干了耗时的事儿..
Service 是运行在主线程中的 ...
主线程中 是不允许干耗时的事儿的
Activity(默认的是 5 秒钟应用程序无响应那么 就会报 ANR ),
service (默认的是 10 秒钟应用程序无响应, 那么就会报ANR)
android中进程的优先级
Android 系统会尽可能的保持应用程序的进程 一致存在, 即使在应用退出了之后 也仍然 这样... 但是 如果发现内存不够用了,
要去启动 新的进程时, 那么会按照进程的优先级顺序 去 杀死 某些 老的进程 .
进程: 就是一块独立的内存空间,用来运行 程序的
Android中的 进程的分类:
1.前台进程:
, 可以与用户直接进行交互的 , 就是前台进程 (可以获得焦点的)
2.可视进程:
, 可以看到, 但是不能直接与用户进行交互
3.服务进程:
, 进程中 运行了一个服务. 在运行着
4.后台进程:
, 例如, 一个activity 现在不可见了, 但是 在后台运行
5.空进程:
一个进程中,没有服务, 也没有 activity, 整个 应用程序已经退出
重要优先级: 前台进程> 可视进程>服务进程> 后台进程> 空进程
服务可以长期后台运行, 是与 当前的 启动 服务的acitvity 是没有关系的.
android中为什么要有服务
一个activity退出后会变成一个空进程
在内存空间不够用的时候 ,首先清理掉空进程,但是服务进程被干掉后会自动恢复
保留进程是为了快速启动,一个进程实际上是一个Linux process
关于服务一些额外的内容
关于启动服务的生命周期
点击 开启服务, 那么服务会 创建. 点击关闭服务器, 服务就 又 会销毁
服务 只会被创建一次调用oncreate , 多次开启服务, 只会去重复调用 onstartcommand , 并不会去新创建服务, 不会调用oncreate
服务也只会被关闭一次, 开启服务后 可以去关闭 服务, 会调用 ondestroy方法 销毁服务
直接使用启动服务调用服务中的方法弊端
结论:使用开启服务的方式 去调用服务中的方法 是 走不通的 , 调用不了 服务中的方法 ...
需要 使用 绑定服务 的方式 去调用 服务中的方法....
绑定服务调用服务中的方法
绑定服务实现的内部原理与代码对照
上午的绑定服务实现的原理回顾&抽取接口去隐藏内线的其他的方法
绑定服务的编写流程详解
-
第一步:
在 服务中 去编写一个 要被 外面调用到的 方法
第二步:
在服务中提供一个 内线 ,这个内线是 继承了Binder类 实现了 IService接口的
第三步:
编写一个IService接口 , 提供一个 方法
第四步:
进到 服务中 内线中, 在内线 里 实现接口的方法, 调用 服务中的 的方法
第五步:
在onBind方法中 , 返回 内线
第六步:
回到 屁民 activity中, 使用绑定服务的方式去 开启服务
第七步:
编写 屁民 activity 和 服务的内线的通讯 频道
在通信频道的 serviceConnection的实现类 中 的onServiceConnected中 拿到 对 内线的引用
第八步:
通过 对内线的引用,去调用 service中的方法
服务的生命周期一
服务的生命周期二
断开连接的方法需要手动的去调用,但是不能像他说的那样吧 agent 置为null,因为agent还需要被调用
绑定服务完整的生命周期:
绑定服务: 调用 oncreate, onbind方法
调用服务中的方法-------
解绑服务: 调用 onunbind方法, 调用 ondestroy方法 服务销毁
绑定服务了之后 , 直接去解绑服务, 然后再去调用 服务中的方法 ..
绑定服务的时候, 如果 绑定服务的应用 退出了, 那么 服务也会 被销毁 ...
而 开启服务时, 如果 开启服务的 应用退出了, 但是 这个被开启的服务 仍然是 在 后台 运行的, 是一个后台的服务进程.
Oom和 memory leak?
关于绑定服务和开启服务的生命周期区别
绑定服务的时候, 如果 绑定服务的应用 退出了, 那么 服务也会 被销毁 ...
而 开启服务时, 如果 开启服务的 应用退出了, 但是 这个被开启的服务 仍然是 在 后台 运行的, 是一个后台的服务进程.
栗子: 今日头条监听自己的服务器有没有新的推送信息
混合开启服务介绍
绑定服务可以 调用 服务中方法 ---- 好处
开启服务 可以让服务在后台 一直运行-- 好处
混合开启服务:
开启服务
绑定服务
调用服务的方法
解绑服务
关闭服务
结论: 如果以后 需要去 在后台一直运行服务, 并且又想调用服务中的方法, 那么请 严格 按照 如上的 5 步 去走. 否则可以能会导致
一些 莫名其妙的问题...
混合开启服务的实验演示
这段时间内容回顾一
- 布局介绍 --- 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() ---- 办证
混合开启服务