Android学习之路 四大组件之BroadCastReceiver

1.为什么要使用广播接收者(BroadCastReceiver)

1>Android系统内部相当于已经有一个电台 定义了好多的广播事件  比如外拨电话 短信到来 sd卡状态  电池电量变化....

2>谷歌工程师给我们定义了一个组件专门用来接收这些事件的  那就是BroadCastReceiver

3>目的就是为了方便开发者进行开发

2.小案例 熟悉下广播接收者的使用(ip拨号器)

  (1)定义一个类继承BroadCastReceiver (就像是听电台,先准备了一个收音机)

//四大组件就要到androidManifest
public class OutGoingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //从sp中获得保存的数据
        SharedPreferences config = context.getSharedPreferences("config", 1);

        String ipnumber = config.getString("ipnumber", "17951");

        //获得广播发过来的数据
        String number = getResultData();
        //判断是否是长途电话
        if(number.startsWith("0")){
            setResultData(ipnumber+number);
        }
    }
}

 

(2)记得要在清单文件中配置broadcastReceiver(配置broadcastReceiver就是在收音机中加入电池。然后指定activity,就是调节频道,指定收听的频道)

 
<receiver android:name=".OutGoingCallReceiver">
    <intent-filter>
        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    </intent-filter>

再添加一个权限

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

实现一个ip拨号器,在拨打0开头的电话时 自动在前面加上用户手动保存的ip号

  (3)当我们配置的action 的事件发生了  onReceive方法就会执行 

听电台的过程缺一不可

3. 不同版本广播的特点

  (1)4.0之后的手机 谷歌为了更加安全考虑  要求第一次安装应用的时候必须有界面

  (2)在设置页面有一个强行停止的按钮 如果点击了 广播事件就不生效

  (3)在2.3的版本的手机没有这样的安全设计
4.小案例(卸载安装广播事件)

 

public class AppStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if("android.intent.action.PACKAGE_ADDED".equals(action)){
            System.out.println("安装了aaaaaaaaaaaa");
        }else if("android.intent.action.PACKAGE_INSTALL".equals(action)){
            System.out.println("安装了bbbbbbbbbbbb");
        }else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            System.out.println("卸载了呢。。。。。。");
        }
    }
}

清单文件配置

<receiver android:name=".AppStateReceiver">
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_ADDED"/>
        <action android:name="android.intent.action.PACKAGE_INSTALL"/>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <!--想要action生效得配置一个一个scheme-->
        <data android:scheme="package"/>
    </intent-filter>

5.小案例对开机事件的广播进行页面跳转

BroadCastReceiver

public class RebootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //开机跳转该页面
        Intent intent1 = new Intent(context,MainActivity.class);
        //不能直接在广播接收者中直接跳转页面 需要指定一个标记 添加一个任务栈的标记
        intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //开启页面
        context.startActivity(intent1);
    }
}

在清单文件进行配置

<receiver android:name=".RebootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

记得要加一个权限允许接受开机启动

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

完成后就会在手机启动后跳转到所写页面。

注意:不能直接在广播接收者中直接跳转页面 需要指定一个标记 添加一个任务栈的标记intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

6.有序广播和无序广播

无序广播:类似新闻联播:广播不可以被终止  数据不可以被修改 (sendBroadCast)getRequestDate获得广播携带传递的数据

有序广播:类似中央发送的红头文件  按照优先级一级一级的接收 有序广播可以被终止 数据可以被修改 (sendOrderBroadCast)

一个有序广播的小案例 北京下发黄金 进行一个逐级广播 在清单文件中配置广播接收者 配置一个参数 prioriity(一般-1000~1000)

1>写一个有序广播发送者

/写一个有序广播
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }
    public void click(View v){
        Intent intent = new Intent();
        intent.setAction("com.zkcd.gold");
        //发送一个有序广播
        //receiverPermission 接受的权限
        //resultReciver最终的接收者
        //initialCode 初始化码
        //initialData 初始化数据
        FinallyReciver finallyReciver = new FinallyReciver();
        sendOrderedBroadcast(intent,null,finallyReciver,null,
                1,"北京发了1000kg黄金",null);
    }
}

在有序广播中,添加一个特殊的广播接收者(不需要在Androidmanifest中配置)
//特殊的广播接收者 不需要在清单文件配置
public class FinallyReciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String resultData = getResultData();
        Toast.makeText(context,"最终(钦差):"+resultData,1).show();
    }
}

广播接收者一共写了4个,都一样的,这里陈述一个:

public class GoldBroadCastReciver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String resultData = getResultData();
        Toast.makeText(context,"省长:"+resultData,1).show();
//终止        abortBroadcast();
        //可以对数据进行修改
        setResultData("北京发了500kg黄金");

    }
}

 

<receiver android:name=".GoldBroadCastReciver">
    <intent-filter android:priority="1000">
        <action android:name="com.zkcd.gold"></action>
    </intent-filter>
</receiver>
<receiver android:name=".CityBroadCastReciver">
    <intent-filter android:priority="500">
        <action android:name="com.zkcd.gold"></action>
    </intent-filter>
</receiver>
<receiver android:name=".CountryBroadCastReciver">
    <intent-filter android:priority="100">
        <action android:name="com.zkcd.gold"></action>
    </intent-filter>
</receiver>
<receiver android:name=".FarmerBroadCastReciver">
    <intent-filter android:priority="1">
        <action android:name="com.zkcd.gold"></action>
    </intent-filter>
</receiver>

 

7.特殊广播接收者

  比如操作特别频繁的广播事件 屏幕的锁屏和解锁 电池电量的变化 这样的广播接收者在清单文件里面注册无效

一个小案例熟悉下

写一个对手机锁屏解锁的广播接收

public class MainActivity extends AppCompatActivity {

    private ScreenReceiver screenReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //特殊的广播需要动态注册
        screenReceiver = new ScreenReceiver();
        IntentFilter intentFilter = new IntentFilter();
        //为这个广播设置action
        intentFilter.addAction("android.intent.action.SCREEN_ON");
        intentFilter.addAction("android.intent.action.SCREEN_OFF");
        registerReceiver(screenReceiver,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //记得要在activity关闭的时候取消注册
        unregisterReceiver(screenReceiver);
    }
}
public class ScreenReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if("android.intent.action.SCREEN_ON".equals(action)){
            System.out.println("屏幕打开了");
        }else if("android.intent.action.SCREEN_OFF".equals(action)){

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值