本帖最后由 allen927 于 2015-11-22 18:59 编辑
同样的课程、老师、就业,更好的学习环境,更低的学习成本! android基础Day07(广播服务)
《 如果感觉今天的知识点都会了,可以直接做作业,来进行检测》
•(了解)为什么需要广播接收者广播接收者:接收广播的,android设计了一个类BroadcastReceiver来描述广播接收者 ,四大组件之一。 广播:Broadcast 广播和广播接收者完成一个消息机制。重量级别 需要激活的组件 组件之间。应用和应用之间 消息机制:Handler +Message 用于线程之间。
•(掌握)有序广播和无序广播无序广播:没有接收的先后顺序,所有的广播接收者同时接收 有序广播:有接收的先后顺序,是由广播接收者自己指定。 取值:-1000-- 1000 如果先接收的广播接收者中断广播,那么后面的广播接收者就无法接收了。 例外:如果有序广播在发出的时候明确的指定了广播接收者,那么这样的广播无法中断,一定会传递给指定的接收者。
发送广播的方法
•(掌握)发送自定义的广播 发送普通广播
订阅广播: 1 xml清单订阅
2 java订阅
加强版
例子 如果是在Activity 的外部 去调用startActivity() 你需要给intent 添加一个flag 标记
有序广播
•(掌握)广播接受者案例-ip拨号器
扩展 黑名单 •(掌握)广播接收者案例-短信窃听器当手机接收到短信,就会发出一个有序的广播 \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代码订阅)
下载资源
|