A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 allen927 于 2015-11-22 18:59 编辑


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

android基础Day07(广播服务)


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

(了解)为什么需要广播接收者
广播接收者:接收广播的,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笔记
课程视频代码
作业视频代码





53 个回复

倒序浏览
张美老师 来自手机 中级黑马 2015-11-22 23:02:47
沙发
怒赞基哥
回复 举报
张美老师 来自手机 中级黑马 2015-11-22 23:02:48
藤椅
怒赞基哥
回复 举报
赞~\(≧▽≦)/~
回复 举报
神就在我们身边——
回复 举报
大神太牛了,总结这么好,赞一个
回复 举报
果断支持啊!!!!!!!!!!!!!!!!!!!!!!
回复 举报
为啥评论不了
回复 举报
Id_820 中级黑马 2015-12-7 21:48:03
9#
支持,支持
回复 举报
支持,支持
回复 举报
支持,支持
回复 举报
支持支持/....
回复 举报
支持支持!
回复 举报
赞啊,就是牛。不过相信在不久的将来我也可以。哈哈哈。。
回复 举报
壮哉我大黑马
回复 举报
报道呀报到
回复 举报
靠谱,绝地靠谱!
回复 举报
报道!!!!
回复 举报
不管了,加油吧
回复 举报
拼了,跪着走完!
回复 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马