广播接收者

广播接收者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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值