广播接收者
- 01.系统的广播接收者的开发流程
- 02.自定义广播接收者的编写方式
- 03.服务的基本概念
- 04.五种进程的优先级
定义及操作步骤
- 广播接收者: 广而告之(全局性,整个安卓手机系统),被动接收
广播接受者监听sd卡操作步骤:
- 1.创建一个类继承BroadcastReceiver并重写onReceiver方法–例如,买收音机
- 2.在清单文件配置–例如,装电池
- MEDIA_UNMOUNTED表示SD卡处于挂载状态,相反.MEDIA_UNMOUNTED处于未挂载状态
- 3.onReceiver方法,编写业务逻辑
监视开机启动事件–做开机启动应用:
* 1.创建一个类继承BroadcastReceiver并重写onReceiver方法--例如,买收音机
* 2.在清单文件配置--例如,装电池
* app节点下:
<receiver android:name="com.itheima.receiver.ReceiverOpenPhone" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
* 3.onReceiver方法,接收广播.开启界面,在广播接受者中开启界面,需要定义一个flag,告知activity运行在自己的任务栈中,广播接受者不存在上下文,intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK);
* 代码:
Intent i=new Intent(context, SplashActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
* 4.配置权限: android.permission.RECEIVE_BOOT_COMPLETED
注意:
* 通过重写onBackPressed()就可以屏蔽返回键
* 4.0版本以前不用设置权限
* 4.0版本后需要声明权限: android.permission.RECEIVE_BOOT_COMPLETED
ip拨号器–有序
* 需求,在拨电话是自动增加一个ip前缀
* 1.activity设置:
* 1. UI界面设置layout:
* 2. 关心控件,设置点击事件
* 3. 业务逻辑: 获取EditText中ip前缀,用sp保存,并回显
* 2. 广播接受者设置:
* 1.写一个类继承BroadCastReceiver,并重写onReceiver方法--买一个收音机
* 2.清单文件设置:
* <receiver android:name="com.itheima.broadcastreceiver.IPCallHelperBDCReceiver" >--装电池
<intent-filter>--调频道
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
* 3.权限配置: 因需要监听用户电话,需要给权限: android.permission.PROCESS_OUTGOING_CALLS
软件安装和卸载的广播接受者
- 1.动作:安装PACKAGE_ADDED/卸载PACKAGE_REMOVED,可同时配置,表示任意一个满足
- 2.获取动作intent.getAction,判断是什么动作
- 3.获取应用包名称,intent.getData
短信广播接受者–会复制即可
短信: PDU
搜索安装源代码网站: grepcode.com,查看源码,最好看低版本
* 0.写一个类继承: BroadCastReceiver
* 1.动作: android.provider.Telephony.SMS_RECEIVED
* 2.设置权限: android.provider.Telephony.SMS_RECEIVER
* 3.获取短信数据--PDU的数据
代码:
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj:objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String body = smsMessage.getMessageBody();
String sender = smsMessage.getOriginatingAddress();
System.out.println("body:"+body);
System.out.println("sender:"+sender);
abortBroadcast();
}
广播接受者的特点
- 即使应用程序的进程不存在,广播一到来,广播会自动开启
- 4.0 版本后,用户可以强行停止广播,将无法接受广播
自定义的广播接受者
- 定义广播:
- 1.界面中:
- 1.编辑UI界面,关心控件,点击事件
- 2.创建意图: Intent intent = new Intent();
- 3.设置动作: intent.setAction(“com.itheima.ccav.XWLB”);
- 4.发送广播: sendBroadcast(intent);//无序广播.
- 1.界面中:
广播事件的类型
有序广播
* 高优先级的先得到,高优先级的可以拦截广播消息或者修改广播消息
* 缺点: 效率低
* sendOrderBroadcast...
* 获取数据getResultData()
* abortBroadcast--终止广播
* 过滤器中要配置优先级: priority最高优先级1000,最低-1000
无序广播
* ..
* 缺点: 同时接到广播,不能修改消息
动态广播接受者
手机锁屏监听–视频播放,地图应用
- 动作: SCREEN_OFF/ON
特殊广播事件,在Android里面有一些产生频繁的广播事件,在清单文件配置是无效的
电量变化,屏幕锁屏和解锁,需要在代码中配置
在代码中配置:
service
Windows: 长期运行在后台,没有界面的进程就叫服务
Android: 长期运行在后台,没有界面的,服务是运行当前应用程序的,就叫服务
服务的父类和activity的父类是同一个对象,contextWrapper
操作步骤:
1. 写一个类继承service
2. 配置清单文件:
1. service 属性name
3. 重写oncreate
4. 开启服务:
1. 创建意图对象
2. 开启服务startService(intent)
5. 停止服务:
1. 创建意图对象
2. 停止服务stopService(intent)
应用场景:
1. 监视一个硬件是否插入
2. 链接服务器刷新最新的数据--股票
3. 定时轮询
注意: 服务是运行在主线程中,不能做耗时性操作
进程优先级:
在Android 中进程优先级由高到低,依次分为Foreground process、Visible process、Service process、Background process、Empty process。
Foreground process
前台进程:
1. 拥有一个正在和用户交互的Activity(也就是说Activity 的onResume()方法被执行了)。
2. 拥有一个被用户的正在交互的Activity 绑定的Service。
3. 拥有一个以“前台模式”运行的Service–该Service 已经被调用了startForeground()方法
4. 拥有一个正在执行生命周期方法的Service(onCreate()、onStart()、onDestory())
5. 拥有一个BroadCastReceiver 并且正在执行onReceive()方法
visible process
可视进程:
1. 拥有一个不是前台的Activity(onPause 方法被调用),但是对用户依然可见。这种情况(处于暂停状态的Activity)发生,比如,如果前台Activity 打开了一个dialog,该dialog 下面依然可见Activity。
2. 拥有一个被可见或者前台Activity 绑定的Service。
Service process
服务进程:
一个拥有正在运行的Service,并且该Service 是被startService()方法启动起来的进程,并且该进程没有被归类到前面的两种(前置进程和可视进程)类型,那么该进程就是服务进程
Background process
后台进程:
一个拥有对用户不可见的Activity(该Activity 已经被执行了onStop()方法)进程叫做后台进程
Empty process
空进程:
不拥有任何系统组件(指四大组件)的进程
进程的回收机制:
进程的回收顺序是:从低到高
1. 当系统内存不够用时, 会把空进程一个一个回收掉
2. 当系统回收所有的完空进程不够用时, 继续向上回收后台进程, 依次类推
3. 但是当回收服务, 可视, 前台这三种进程时, 系统非必要情况下不会轻易回收
优先级: 前台进程>可视进程>服务进程>后台进程>空进程