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下一页
您需要登录后才可以回帖 登录 | 加入黑马