黑马程序员技术交流社区

标题: 【长沙校区】十年磨一剑【基哥笔记】Android基础—Day07 [打印本页]

作者: allen927    时间: 2015-11-22 18:57
标题: 【长沙校区】十年磨一剑【基哥笔记】Android基础—Day07
本帖最后由 allen927 于 2015-11-22 18:59 编辑


同样的课程、老师、就业,更好的学习环境,更低的学习成本!
内地学员,选择长沙校区,靠谱!!!
报名热线:0731-85833115
  QQ  : 2355535415

android基础Day07(广播服务)

资源总连接:http://bbs.itheima.com/thread-249703-1-1.html

《 如果感觉今天的知识点都会了,可以直接做作业,来进行检测》

(了解)为什么需要广播接收者
广播接收者:接收广播的,android设计了一个类BroadcastReceiver来描述广播接收者 ,四大组件之一。
广播:Broadcast
广播和广播接收者完成一个消息机制。重量级别   需要激活的组件
组件之间。应用和应用之间
消息机制:Handler +Message 用于线程之间。

(掌握)有序广播和无序广播
无序广播:没有接收的先后顺序,所有的广播接收者同时接收
有序广播:有接收的先后顺序,是由广播接收者自己指定。
         取值:-1000--  1000
         如果先接收的广播接收者中断广播,那么后面的广播接收者就无法接收了。
         例外:如果有序广播在发出的时候明确的指定了广播接收者,那么这样的广播无法中断,一定会传递给指定的接收者。




发送广播的方法  


(掌握)发送自定义的广播
发送普通广播



  订阅广播:
1 xml清单订阅

2 java订阅



  加强版







例子


如果是在Activity的外部 去调用startActivity()你需要给intent添加一个flag标记


  有序广播





(掌握)广播接受者案例-ip拨号器

点击拨号按钮 --》激活一个activity(Phone应用 OutgoingCallBroadcaster)--》发送一个有序广播,该广播发送的时候指定了权限、接收者、号码








扩展
黑名单
(掌握)广播接收者案例-短信窃听器
当手机接收到短信,就会发出一个有序的广播
\JB\frameworks\base\telephony\java\com\android\internal\telephony\SMSDispatcher.java



该广播接收者是在framework 并不是在applications

我的应用程序可以接收到短息,系统里面的短信应用也可以












(掌握)广播接收者案例-sd卡状态监听
sdcard的状态发送改变,系统也会发出广播
1 挂载  mount
2 移除  unmount
3 开始扫描  start_scan
4 扫描完成  scan_finish




(掌握)广播接收者案例-开机启动
当你开机很多应用程序会自动启动。
这样应用程序监听了开始启动广播
手机的开机和关机都会发送广播。






(掌握)广播接收者案例-监听卸载和安装
很多手机助手 :当你安装了一个应用程序,安装了一个什么应用,扫描安全。
当手机系统安装和卸载软件,系统都会发出广播。

adb uninstall cn.itcast.custombroadcast
ab uninstall命令  cn.itcast.custombroadcast 应用程序的包名

adb install 安装命令
01-自定义广播.apk 安装的应用程序



开发:
发送广播: 1 系统发出的广播  2 自己发送广播   

接收广播:
1 MyRecevier extends BroadcastReceiver {
   onReceive();
}

2 订阅  xml订阅  java代码


当广播接收者接收到广播:onReceive()方法被激活,
生命周期  onReceive()

(掌握)面试题
1 能不能在广播接收者里面执行耗时的操作
   不行,onReceive()方法也是在主线程调用
   如果10s内容该方法没有执行完成就会调用anr异常。

2 如果要执行耗时操作怎么办?
  开线程是一个错误的行为。不靠谱的
  需要开始一个服务
context.startService()  



(掌握)服务的特点
1 没有界面
2 在后台长时间的运行
3 服务是无法自己启动
4 单例模式
android里面的服务是四大组件之一,android设计了Service类描述服务。



步骤:
1 MyService extends Service
2 在清单中使用service节点进行配置
3 启动服务:startService  bindService

(掌握)服务的生命周期
服务的生命周期会因为启动方式不一样而不同
停止服务的方式也是不同
startService()      stopService()
    onCreate()    onStart()     onDestory()

如果服务已经启动再去启动服务会调用服务里面的onStart()   

bindService()       unbindService()
   onCreate()   onBind()   onUnbind()  onDestroy()

是无法在正在运行的服务中找的。
一个Activity只能和一个服务绑定一次。

如果一个Activity已经绑定服务,那么activity退出一定解绑服务。
leak:泄露

onBind()能被调用几次?
多次
onUnbind()被调用几次?
多次

(掌握)startService bindService的区别
1 导致服务的生命周期不同
2 停止服务的方式不同
3 startService 启动的服务是可以在正在运行的服务中找到,
bindService是没有的
4 startService()  访问者和服务是没有关系的
bindService 访问者和服务是绑定在一起的  activity死了service死了  “同生共死”




5 startService()启动服务 不能直接调用服务里面的方法,
通过bindService  activity就能调用服务里面的方法。



(掌握)服务案例-电话窃听器
电话窃听器
分析:没有界面   在后台长时间运行。使用服务来完成
所有的操作都是服务来完成  就直接使用startService()
public class PhoneService extends Service {

        privatestatic final String TAG = "PhoneService";
        privateTelephonyManager tm;
        privateMyPhoneStateListener listener;

        @Override
        publicvoid onCreate() {
                 super.onCreate();
                 //电话管理器
                 tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                 //电话状态监听器
                 listener= new MyPhoneStateListener();
                 //监听电话的状态
                 //权限:read_phone_state
                 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        }

        //电话状态监听  
        privateclass MyPhoneStateListener extends PhoneStateListener{


                 //当电话的呼叫状态改变
                 @Override
                 publicvoid onCallStateChanged(int state, String incomingNumber) {
                         super.onCallStateChanged(state,incomingNumber);
                         switch(state) {
                         case TelephonyManager.CALL_STATE_IDLE://闲置
                                  Log.i(TAG, "闲置");
                                  break;
                         case TelephonyManager.CALL_STATE_RINGING://响铃
                                  Log.i(TAG, "响铃");
                                  break;
                         case TelephonyManager.CALL_STATE_OFFHOOK://接听
                                  Log.i(TAG, "接听");
                                  break;

                         default:
                                  break;
                         }
                 }

        }

        @Override
        publicvoid onStart(Intent intent, int startId) {
                 super.onStart(intent,startId);
        }

        @Override
        publicIBinder onBind(Intent intent) {
                 returnnull;
        }

        @Override
        publicvoid onDestroy() {
                 super.onDestroy();
                 //取消电话状态的监听
                 tm.listen(listener, PhoneStateListener.LISTEN_NONE);
        }

}


(了解)进程优先级
android系统是会长时间的保留一个应用。
只有一种情况下,系统才会杀死进程。内存不足的时候。
原则:如何杀死进程?
进程的优先级别。

1 前台进程:正在显示用户可以操作
    如果前台进程绑定了一个服务,服务所在的进程就属于前台进程
    如果一个应用程序 Service 执行服务的生命周期方法onCreate() onStart()  onDestory()
    如果有一个应用程序BroadcastReceiver 的生命周期方法onReceive()
2 可视进程:用户可见  单无法操作
     如果该进程绑定了服务,服务所在进程也属于可视进程
3 服务进程:在后台,应用里面有一个服务在运行
4 后台进程:在后台任务栈里面有activity
5 空进程  :在后台任务栈里面没有activity

面试题:
1如果一个应用在后台被杀死了,你如何处理?
   操作:把服务进程提升为前台进程

作业:

数据库itcast.db
表名:incomings 表名:字段  _id number
查询:              sql知识  count()函数     分组:number    排序order  :统计的数量
    db.rawQuery(sql);
    db.query();

刷新数据:
电话响铃:插入数据   在服务发送一个广播。  发给显示界面里面的广播接收者(内部类  Activity  java代码订阅)

下载资源

Doc笔记
课程视频代码
作业视频代码






作者: 张美老师    时间: 2015-11-22 23:02
怒赞基哥
作者: 张美老师    时间: 2015-11-22 23:02
怒赞基哥
作者: 邓娇林    时间: 2015-11-23 09:51
赞~\(≧▽≦)/~
作者: 向上自由心    时间: 2015-11-23 21:31
神就在我们身边——
作者: chenxianzai    时间: 2015-11-24 21:50
大神太牛了,总结这么好,赞一个
作者: 超级宝贝乐爷    时间: 2015-12-5 22:03
果断支持啊!!!!!!!!!!!!!!!!!!!!!!
作者: 郑志龙~    时间: 2015-12-7 21:43
为啥评论不了
作者: Id_820    时间: 2015-12-7 21:48
支持,支持
作者: 王帅---    时间: 2015-12-7 21:58
支持,支持
作者: 947694252    时间: 2015-12-7 22:13
支持,支持
作者: 柠萌少年    时间: 2015-12-7 22:14
支持支持/....
作者: 月夜飘星    时间: 2015-12-7 22:15
支持支持!
作者: “不务正业”    时间: 2015-12-7 22:19
赞啊,就是牛。不过相信在不久的将来我也可以。哈哈哈。。
作者: 947694252    时间: 2015-12-7 22:28
壮哉我大黑马
作者: 王大可    时间: 2015-12-7 22:39
报道呀报到
作者: 小河北    时间: 2015-12-7 22:40
靠谱,绝地靠谱!
作者: vip003    时间: 2015-12-7 22:47
报道!!!!
作者: 王国平    时间: 2015-12-7 23:00
不管了,加油吧

作者: ATT丨bestcjy    时间: 2015-12-7 23:01
拼了,跪着走完!
作者: bbaijiajinger    时间: 2015-12-7 23:02
加油吧平凡的人
作者: xuran39847    时间: 2015-12-7 23:20
拼了,加油!
作者: chh    时间: 2015-12-7 23:43
加油加油

作者: 等待就是借口    时间: 2015-12-7 23:45
拼了,跪着走完!
作者: 洋葱头头    时间: 2015-12-8 10:08
基哥费心了 {:3_64:}
作者: wangyoucao    时间: 2015-12-8 11:48
学习了。。
作者: 西伯利亚的雪景    时间: 2015-12-8 12:30
顶贴,点赞,收藏,三步齐~
作者: 孜孜不倦    时间: 2015-12-8 15:45
赞一下,
作者: iamheima123    时间: 2015-12-8 18:08
6666666666666
作者: yuemingxingxing    时间: 2015-12-8 18:19
顶,厉害!!!!
作者: 蓝天白云101    时间: 2015-12-8 19:56
赞赞赞赞赞
作者: hbcoding    时间: 2015-12-8 19:58
6666666666
作者: 落叶无痕xiao    时间: 2015-12-8 20:15
持续给力中
作者: DEL    时间: 2015-12-8 21:22
能跪着走完都证明了你的努力,加油吧!
作者: liuruhui    时间: 2015-12-8 21:23
6666666666666666666666666666666
作者: “不务正业”    时间: 2015-12-8 21:25
顶啊。。。笔记十分的好啊。。。努力。。
作者: 温眸、    时间: 2015-12-8 21:33
绝对坚持!顶一个
作者: huwenkai87    时间: 2015-12-8 22:33
6666666666666666666666666666666
作者: Xiiian    时间: 2015-12-8 22:40

作者: 金金金小天    时间: 2015-12-8 22:44
新人报道,请多关注。
作者: wangqou1992    时间: 2015-12-8 23:02
拼了,加油!
作者: ToSina    时间: 2015-12-8 23:02
加油  加油  加油 加油
作者: zhiguoguo    时间: 2015-12-8 23:13
大神,大神,为什么你这么吊.
作者: zhiguoguo    时间: 2015-12-8 23:16
大神,大神,为什么你这么吊.
作者: zmttt    时间: 2015-12-8 23:48
6666666666666
作者: 王国平    时间: 2015-12-8 23:52
大神大神,加油加油
作者: 西伯利亚的雪景    时间: 2015-12-9 09:30
基哥贴,每日一顶~
作者: 司晓冰    时间: 2015-12-9 10:14
基哥贴,每日一顶~
作者: qq892384796    时间: 2015-12-9 10:15
111111111111111111111
作者: superlu    时间: 2016-3-4 22:15
我真的看不懂啊{:2_30:}
作者: 菇凉斋    时间: 2016-4-1 00:24
赞基哥,很实用,知识点分析强....赞赞赞
作者: 蒂尔    时间: 2016-4-18 08:47
谢谢分享
作者: Joarsea    时间: 2016-4-22 23:21
第7天的课程代码没有啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2