Android的全局大喇叭——发送自定义广播
导读:发送自定义广播
从上一篇文章(详解安卓中的广播机制)中我已经简介了安卓开发中的广播接收器机制,我们可以通过广播接收器来接收系统广播,接下来我们就要学习一下如何在应用程序中发送自定义的广播。前面我们也介绍过广播主要分为两种类型:标准广播和有序广播,在下面我们就将通过实践的方式来讲解一下这两种广播的具体区别。
先前准备工作—接收器的配置
所有的广播要发送,就必须要一个接收器嘛!首先我们使用android studio 提供的快捷功能新建一个广播接收器,在这里我们命名为MyBroadcastReceiver代码如下所示:
package com.example.gq.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"receives in MyBroadcasrReceiver",Toast.LENGTH_SHORT).show();
//在这里我们还是只用最简单的方法来一个文本提示!
}
}
根上章所说的一样简单,我们在静态注册广播还需要在Androidmanifest.xml中对编译器自动生成的代码加上接收器的指令和提供相应需要的权限。
下面是在Androidmanifest.xml中提升权限的代码:
<!-- 下面是有关静态广播的系统网络权限声明 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
下面是在接收器的侯活动代码:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true"></receiver>
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
<!--添加广播接收器需要接收的指令-->
</intent-filter>
</receiver>
由于上一篇文章已经说得比较详细,这里就不再赘述!
(一)发送标准广播
我们先在布局文件中定义一个按钮
.xml:
<Button
android:id="@+id/button"
android:layout_width="368dp"
android:layout_height="wrap_content"
android:text="Send Broadcast"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="8dp" />
<!--大致就是这个咯!-->
再在activity_main.xml中添加点击事件:
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent =new
Intent("com.example.broadcasttest.MY_BROADCAST");
/*
首先我们先构造出一个Intent对象,并把要发送的广播的值传入,然后调用Context的
sendBroadcasr()方法将广播发送出去,这样所有监听com,example.broadcasttest.MY_BROADCAST
这条广播的广播接收器就会收到消息,此时发送出去的广播就是一条标准广播。
就简单而言,就是利用Intent的垮活动数据传递特性,进行广播指令的传递。
*/
sendBroadcast(intent);
}
});
(二)发送有序广播
小伙伴们注意了!这里还是先基于建立广播接收器的条件下,开始的!!!
这里。。。
我为了偷个懒,所以还是利上面讲的广播接收器。请大家见谅!嘿嘿
这里需要改变的就一段:(按钮点击事件中)
Button button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent =new
Intent("com.example.broadcasttest.MY_BROADCAST");
/*
首先我们先构造出一个Intent对象,并把要发送的广播的值传入,然后调用Context的
sendBroadcasr()方法将广播发送出去,这样所有监听com,example.broadcasttest.MY_BROADCAST
这条广播的广播接收器就会收到消息。
就简单而言,就是利用Intent的垮活动数据传递特性,进行广播指令的传递。
*/
sendOrderedBroadcast(intent,null);
/*这里就是上面这一段发生改变,我们在这里
将sendBroadcast()方法改成sendOrderedBroadcast()方法
并接收两个参数。
第一个参数任然是Intent.
第二个参数是于权限有关的字符串,这里传入null就行了。
*/
}
});
是不是觉得很迷?
说好的有序广播的顺序呢?
完全没有?
这是什么操作?
别急,马上就来,有关有序广播的顺序问题.
在广播接收器由Android Studio自动生成的同时,也会同时在Androidmanifest.xml文件中生成广播接收器的活动,接下来我们的有序,就需要在接收器中添加:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<!-- 上面两行是创建广播文件的时候,自己选择自动生成的两个属性! -->
<!-- 第一行:enabled属性是表示是否启用这个广播接收器 -->
<!-- 第二行:exported属性是表示是否允许这个广播接收器接收本程序以外的广播 -->
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!--上面这段android:priority="100"属性就是给广播设置了优先级,比较是优先级较高的接收器会先收到广播,其满足1>2>3>***>无设置,所以这里优先级大于前面的未设置优先级的广播接收器-->
<!-- 由于android系统启动完成后会发出一条值为:android.intent.action.BOOT_COMPLETED的广播 -->
<!-- 因此我们在<ibtebt-filter>标签里添加了相应的action -->
</intent-filter>
</receiver>
设置优先级后,我们怎么确保广播是否继续传递?
在最初我们创建的广播接收器的类中我们只需用在最后添加一段代码就可以确保广播信号不好继续传递下去:
package com.example.gq.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"receives in MyBroadcasrReceiver",Toast.LENGTH_SHORT).show();
//在这里我们还是只用最简单的方法来一个文本提示!
abortBroadcast();
/*在onReceive()方法中调用了abortBroadcast()方
法,就表示将这条广播截断,能接收到广播的就只
有优先级最高的,其他广播接收器就无法接收到广播信号
*/
}
}
还是给大家推荐一首歌,一个女孩子推荐给我的。。。
九张机 叶炫清
那个女孩问我这首歌怎么样。。。
貌似听过,也就一句还好吧。