重拾Android之路(十三)广播

BroadcastReceiver 广播接受者用于接受系统或者其他应用程序发送的广播

注册广播

在Android中如果我们想要使用广播,就必须自定义广播接收者
需要写一个类继承BroadcastReceiver,并且重写里面的onReceiver()方法,实现接受特定的广播,然后去执行相应的事情

自定义一个广播接受者

public class MyBroadCastReceiver extends BroadcastReceiver   
{  
   @Override  
   public void onReceive(Context context, Intent intent)   
   {   
       //在这里可以写相应的逻辑来实现一些功能
       //可以从Intent中获取数据、还可以调用BroadcastReceiver的getResultData()获取数据
   }   
}

这样我们就创建好了一个广播接受者,这个很简单,但是接下来我们要把这个广播注册起来,就像Activity,service需要在清单配置文件中注册一样。

两种注册广播的方式

代码中动态注册

步骤如下:
1. 实例化自定义好的广播接收者
2. 实例化意图过滤器,并设置需要过滤的广播类型(比如我们接受短信系统发送的广播)
3. 使用context中的registReceiver(BroadcastReceiver,IntentFilter,String,Handler)方法注册广播

//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();

//实例化过滤器并设置要过滤的广播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

//注册广播   
myContext.registerReceiver(smsBroadCastReceiver,intentFilter, 
             "android.permission.RECEIVE_SMS", null);

在清单配置文件中注册

直接在Manifest.xml文件的节点中配置广播接收者。

<receiver android:name=".MyBroadCastReceiver">  
            <!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
            <intent-filter android:priority="20">
            <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
</receiver>

还要在同级的位置配置可能使用到的权限

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

两种广播注册的方式

  1. 第一种不是常驻广播,会随着生命周期的结束而消失
  2. 第二种是常驻广播,就算应用关闭了,只要有相应的广播,都可以唤醒

发送广播

当我们需要发送一个自定义广播来通知应用程序中其他组件的状态时,就可以发送一个广播
两种发送广播的方式
1. 通过context.sendBroadcast(Intent)或者context.sendBroadcast(Intent,String)发送无序广播,其中后者是添加了权限
2. 通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播

无需广播:所有的接受者都可以接受事件,不可以被修改,不可以被拦截
有序广播:按照优先级,一级一级的往下传递,接受者可以修改广播数据,也可以终止广播

无序广播的使用

定义一个按钮,为他添加点击事件,然后发送一个无序广播

Intent intent = new Intent();
//设置intent的动作为com.example.broadcast,可以任意定义
intent.setAction("com.example.broadcast");
//发送无序广播
sendBroadcast(intent);

定义一个广播接受者,来接受这个广播

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"收到广播", Toast.LENGTH_SHORT).show();
    }
}

在清单配置文件中配置该接收者

<receiver
            android:name=".MyReceiver" >
            <intent-filter>
                <!-- 动作设置为发送的广播动作 -->
                <action android:name="com.example.broadcast"/>
            </intent-filter>
</receiver>

有序广播

和无序广播使用不同的是 通过 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。
定义一个按钮,设置其点击事件,发送一个有序广播。

        Intent intent = new  Intent();
        //设置intent的动作为com.example.broadcast,可以任意定义
        intent.setAction("com.example.broadcast");
        //发送无序广播
        //第一个参数:intent
        //第二个参数:String类型的接收者权限
        //第三个参数:BroadcastReceiver 指定的接收者
        //第四个参数:Handler scheduler
        //第五个参数:int 此次广播的标记 
        //第六个参数:String 初始数据
        //第七个参数:Bundle 往Intent中添加的额外数据
        sendOrderedBroadcast(intent, null, null, null, "这是初始数据", );

定义多个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver1 extends BroadcastReceiver {
    public MyReceiver1() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        //获取广播中的数据(即得到 "这是初始数据" 字符串)
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
        //修改数据
        setResultData("这是修改后的数据");
    }
}
public class MyReceiver2 extends BroadcastReceiver {
    public MyReceiver2() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
        //终止广播
        abortBroadcast();
    }
}
public class MyReceiver3 extends BroadcastReceiver {
    public MyReceiver3() {
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        String message = getResultData();
        Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
    }
}

在Manifest.xml中配置该接收者。并设置优先级:MyReceiver1>MyReceiver2>MyReceiver3。

<!-- 优先级相等的话,写在前面的receiver的优先级大于后面的 -->
<receiver
            android:name=".MyReceiver1" >
            <!-- 定义广播的优先级 -->
            <intent-filter android:priority="1000">                
                <!-- 动作设置为发送的广播动作 -->
                <action android:name="com.example.broadcast"/>
            </intent-filter>
</receiver>
<receiver 
               android:name=".MyReceiver2" >
                   <!-- 定义广播的优先级 -->
                   <intent-filter  android:priority="0">
                   <!-- 动作设置为发送的广播动作 -->
                   <action android:name="com.example.broadcast"/>
            </intent-filter>
</receiver>
<receiver 
               android:name=".MyReceiver3" >
                   <!-- 定义广播的优先级 -->
                   <intent-filter  android:priority="-1000">
                   <!-- 动作设置为发送的广播动作 -->
                   <action android:name="com.example.broadcast"/>
            </intent-filter>
</receiver>

运行结果:MyReceiver1得到广播数据后打印“这是初始数据”,MyReceiver2接收到广播数据打印“这是修改后的数据”,MyReceiver3没有打印。

参考资料

android两种注册,发送广播的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio 的拾色器可以在布局编辑器中找到。打开布局文件并选择您想要设置颜色的视图,然后在右侧的 "Properties" 窗格中找到 "Background" 或 "TextColor" 属性。在这个属性旁边有一个小色块,点击它就可以打开拾色器。 您也可以使用 Android Studio 的默认颜色选择器来添加或编辑颜色。在 "res/values/colors.xml" 文件中,右键单击颜色值的定义行,然后选择 "Edit color" 选项。这将打开默认的颜色选择器,您可以在其中选择颜色或使用调色板来自定义颜色。 最后,您还可以通过安装插件来扩展 Android Studio 的拾色器功能。例如,Color Picker 插件可以让您在任何应用程序中选择颜色,并将其复制到剪贴板中以供粘贴。 ### 回答2: 在Android Studio中,拾色器位于布局编辑器的右侧工具栏中。您可以打开布局编辑器,然后在右侧的工具栏中找到"Color Picker"(拾色器)图标。单击该图标,将打开一个对话框,其中包含拾色器工具。 在拾色器工具中,您可以通过手动输入RGB(红绿蓝)、HSB(色调饱和度亮度)或者通过在色彩选框中选择颜色来获取所需的颜色值。您还可以调整颜色的亮度、透明度和色温,以满足实际需求。 在选择完所需的颜色后,您可以通过单击工具栏中的"Pick"(选择)按钮来将所选的颜色值应用到您的布局或代码中。此外,您还可以通过单击左下角的"Copy"(复制)按钮将颜色值复制到剪贴板,方便在其他地方使用。 通过使用Android Studio的拾色器工具,您可以方便地获取和应用颜色值,以满足您在应用程序开发中的设计需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值