广播接收者broadcastReceiver
——–此笔记根据黑马程序员的授课视频所记录
Activity
网络编程1
网络编程2
广播接收者
服务
内容提供者
多媒体
1.为什么需要广播接收者(broadcastReceiver)
【1】有什么样的人听广播 老人 出租车司机
【2】想听广播必须有的:电台 收音机
【3】Android系统内部已经定义好了电台 已经定义好了一些广播事件
比如:外拨电话 短信到来 sd状态 电池电量 。。。
【4】使用广播接收者(broadcastReceiver)去接收系统定义好的这些事件
【5】定义广播接收者的目的是为了方便开发者的开发
2.广播接收者案例_ip拨号器
知识点
<!--注册-->
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--内部也可以加intent-->
<intent-filter>
<!--主要配action 可以配置多个-->
<cation android:name="事件1"></cation>
<cation android:name="事件2"></cation>
<cation android:name="事件3"></cation>
</intent-filter>
</receiver>
/**
*此案例BroadcastReceiver广播接收者的内容
*/
public class MyReceiver extends BroadcastReceiver {
//当配置配置的事件发生时onReceive方法执行
@Override
public void onReceive(Context context, Intent intent) {
//获取当前拨打的电话号码
String currentNumber = getResultData();//获取当前结果的数据
//长途时,在当前的号码前面加上17951
if (currentNumber.startsWith("0")){ //当前号码以0开头说明是长途
setResultData(currentNumber+"17951");//设置返回的数据
}
}
}
视频里的笔记如下:
360永远免费 瑞星 卡巴斯基 滴滴
[1]定义广播接收者 相当于你买了一个收音机
public class MyReceiver extends BroadcastReceiver {
}
[2]在清单文件里配置 相当于你按了一块电池
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>
</application>
[3]具体调到一个合适的频道
<intent-filter>
<action android:name="具体事件" />
</intent-filter>
3.广播接收者案例_sd卡状态监听
知识点
public void onReceive(Context context, Intent intent) {
//获取当前广播的事件类型
String action = intent.getAction();
}
小细节
在监听sd卡的时候需要在intent意图里配置一个data 约束file 因为sd卡里存的数据类型时file
<data android:scheme="file"/>
4.广播接收者案例_短信监听器
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
public class MyReceiver extends BroadcastReceiver {
//当短信到来时执行
@Override
public void onReceive(Context context, Intent intent) {
//获取发送者的号码和发送的内容
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object obj: objects) {
//获取smsmessage实例
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])obj);
//获取发送短信的内容
String body = smsMessage.getMessageBody();
//获取发送短信的人
String address = smsMessage.getOriginatingAddress();
}
}
}
5.不同版本的广播特点
[1]在4.0谷歌工程师有要求 第一次安装程序的时候必须有界面 这样广播接收者才生效
[2]在设置页面有一个强行停止按钮 如果说用户点击了 强制停止按钮那么广播接收者也不生效
[3]在2.3的手机上没有这样的安全设计
6.广播接收者案例_卸载安装
<!--应用安装:此方法是预留的,没有作用-->
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<!--应用安装-->
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<!--应用卸载-->
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<!--想让此action事件生效 还需要配置一个data-->
<data android:scheme="package"/>
大数据挖掘可以用
7.广播接收者案例_开机启动
<!--手机重启-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
public void onReceive(Context context, Intent intent) {
//在这个方法里去开启activity
Intent intent1 = new Intent(context,MainActivity.class);
//注意不能再广播接收者里面直接开启activity 需要添加一个标记 一个任务栈的标记
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//开启activity 此处是广播接收者,所以不能直接start,需要一个上下文content
context.startActivity(intent1);
}
@Override//屏蔽返回键,在activity中重写onBackPressed方法,让其不调用父类的finish()方法
public void onBackPressed() {
//super.onBackPressed();
}
8.有序广播和无序广播
【1】有序广播 类似中央发送红头文件
发广播
接收广播
//配置中优先级越高,越优先接收到广播
String data = getResultData();//获取广播数据信息
setResultData("数据");//修改设置广播数据
abortBroadcast();//终止广播
特点:可以被终止,数据可以被修改
【2】无序广播 比如说新闻联播 不管有没有人看,每天晚上7点准时播放
//发广播
Intent intent = new Intent();
intent.setAction("自定义的action如:com.fjh.receiver");
intent.putExtra("name","广播内容");
sendBroadcast(intent);//发送无序广播
<!--收广播-->
<action android:name="com.fjh.Receiver"/>
intent.getStringExtar("name");
特点:不可以被终止,数据不可以被修改
9.特殊广播接收者
操作特别频繁的广播事件 比如:屏幕的锁屏和解锁 电池电量的变化 这种事件的广播在清单文件里注册无效
注册广播接收者的两种方式
【1】在清单文件通过receiver tag 节点静态发布
【2】动态注册 通过代码的方式注册 (频繁的广播事件要通过这种方式注册)
//创建Receiver对象
MyReceiver myReceiver = new MyReceiver();
//创建IntentFliter对象
IntentFilter intentFilter = new IntentFilter();
//添加要注册的action
intentFilter.addAction("android.intent.action.SCREEN_OFF");//锁屏
intentFilter.addAction("android.intent.action.SCREEN_ON");//解屏
//动态注册广播接收者
registerReceiver(myReceiver,intentFilter);
//当activity销毁的时候要取消广播接收者
@Override
protected void onDestroy() {
unregisterReceiver(myReceiver);
super.onDestroy();
}
10.样式和主题
【1】样式一般作用在控件上 (button textView上) 样式的作用范围比较窄
<!--设置自定义样式-->
<style name="my_style">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:color">#000000</item>
</style>
【2】主题一般作用在activity上或者application节点下 主题的作用范围比较大
<!--设置自定义主题-->
<style name="my_them">
<item name="android:background">#000000</item>
</style>
在清单文件中配置
<application
android:theme="@style/my_them">
</application>
共同点:定义的方式是一样的
11.国际化 i18n
在res下创建不同国家语言环境集目录
中文:value-zh
中文繁体:value-zh-Hant
英文:value-en
12.常见对话框
[1]Toast
[2]普通对话框 单选对话框 多选对话框 进度条对话框
[3]与进度相关的控件 都可以在子线程更新UI
13.两种上下文的区别
【1】this 最终继承context 子类,这个字类有父类没有的东西
【2】getApplicationContext() 返回对象是context对象 父类
【3】对话框只能用this