Android 自定义广播(无序广播) BroadcastReceiver广播接受者(静态、动态)

什么是广播

  1. 它是Android四大组件之一
  2. 一种全局的监听器,用来监听系统全局的广播消息
  3. 系统的大部分消息都以广播的形式发布,比如开机文成的消息。接受到短信的消息,打进打出电话的消息。
  4. Android系统每次启动完成会向外广播一条消息,告诉所有的组件启动完成了,只有继承了Broadcast的类才能捕捉到这些系统消息,然后,你可以,拿它实现你的需求。


广播比喻

  • 比如,现实社会中的,电视台广播,它通过特殊的频率发送他们的信息,而我们用户,只有把频率调成和电视台一样,才可以接受到电视台的信息。

无序广播

没有指定接受者顺序,所有的控件均可接受,先后顺序不定。

建立广播发送者

广播发送,还有一种,过时的,粘性广播发送,故名思意,就是说,广播发送了,但是在程序没有打开时(静态接受者模式),接受不到广播
,一旦打开程序,程序就会马上接受到广播 ,粘性广播,必须配置,其它不用。

//打开广播发送者的  AndroidManifest.xml
<!--设置,粘性广播发送者的权限--> 
    <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>


xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context="com.example.broadcastsender.MainActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/et_mian_test"
        android:hint="需要广播的内容"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="bt_mian_test"
        android:text="广播"
        />
</LinearLayout>


  • 广播发送者 Java 代码
package com.example.broadcastsender;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText editText;

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

        //取到,要广播控件
        editText = (EditText) findViewById(R.id.et_mian_test);
    }

    //测试使用的, 开始广播,按钮点击事件
    public void bt_mian_test(View view){

        //建立无序广播
        Intent intent=new Intent();
        //给广播设定名字,即是特定的(频率),必须唯一
       //推荐使用类名+包名
        intent.setAction("com.example.broadcastsender.MainActivity");
        //设置广播发送的内容,参数一为:键   参数二: 值,可以发送八大基本数据类型,及引用类型
        intent.putExtra("sendBroadcast",editText.getText().toString());
        Log.i("test","广播发送了————"+editText.getText());
         //发送普通广播
       // sendBroadcast(intent);
        //发送粘性广播(粘性必须配置)
        sendStickyBroadcast(intent);
    }


}

广播接受者

当有多个接受者时,接受的顺序,那个接受者先打开程序,就先接受。接受者分二种,一种通过xml配置的静态广播,一种是通过Java代码实现的动态广播。

* 静态广播(通过xml配置实现)*

广播接受者,必须,要配置接受,否者无法接受到广播,打开程序的AndroidManifest.xml 在 节点内添加,广播配置。广播接受,在不打开的情况下,也能接受到,广播。

 <!-- 配置广播接受者,在本配置文件内配置 -->
        <receiver android:name=".ReceiveTwo">
            <!--广播过滤器-->
            <intent-filter>
                <!--接受的广播 名(频率)-->
                <action android:name="com.example.broadcastsender.MainActivity"></action>
            </intent-filter>
        </receiver>


动态广播(通过JAVA实现)
在Activity 中,在启动或者恢复,时注册广播接受者,在Activity销毁时,注销广播接受者,动态广播,由于在Acitivity销毁时,就销毁了广播接受,故此,在应用关闭状态下是无法接受到广播的。

package com.example.broadcastreceiveone;

import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class BroadcastReceiveOne extends AppCompatActivity {

    private IntentFilter intentFilter;
    private ReceiveonOne receiveonOne;

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

        //动态 接受者,就是用Java代码 设置接受者
        //建立接受者对象
        receiveonOne = new ReceiveonOne();
        //建立广播  过滤器
        intentFilter = new IntentFilter();

        //设置,接受的广播 名(频率)
        intentFilter.addAction("com.example.broadcastsender.MainActivity");
    }

    //在Activity启动或者重新启动时
    @Override
    protected void onResume() {
        super.onResume();
        //注册广播接受者  ,参数一  广播接受类对象 参数二  广播过滤器
       registerReceiver(receiveonOne,intentFilter);
    }

    //在Activity 关闭时,注销广播接受者
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销广播,   参数填,被注销的广播
        unregisterReceiver(receiveonOne);
    }
}


广播接受者Java 代码

建立一个类,继承BroadcastReceiv
package com.example.broadcastreceivetwo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class ReceiveTwo extends BroadcastReceiver {
     //建立一个类,继承广播接受者(BroadcastReceiver)类,
    //重写接受广播方法
    @Override
    public void onReceive(Context context, Intent intent) {
        //取到广播,的名字(频率)
        String acton=intent.getAction();
        //判断,如果是我指定的广播
        if("com.example.broadcastsender.MainActivity".equals(acton)){
            //取到,此广播的内容,参数是,广播发送者,设定发送值时的键
            String broadcastValue=intent.getStringExtra("sendBroadcast");
            //我,打印出接受到广播的值
            Log.i("test","我是Two"+broadcastValue);
        }

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值