Android自定义广播(动态、静态)

首先什么是广播:
android的广播概念和我们日常生活中的电台有相通之处,空气中有不同频段,不同电台的广播,而android系统中就有对应的电池的电量,来电,短信还有例如sd卡拔插等等这些广播的消息发出,这些消息就对应着用收音机调频时,不同电台的节目。而我们注册的广播就类似于我收听某个电台的节目,比如一个注册广播收听交通广播,另一个注册的广播收听音乐广播,那么怎么区分是交通广播还是音乐广播呢,这就要通过前一章提到的Intent的action来判断。

不多说上代码:
首先兴建一个项目定义为发送者anjie_android_20broatcast_sender来发送我们的广播

无序广播:
布局文件activity_main

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/main_Editext"
    />
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="send"
    android:text="发送"
    />

java代码MainActivity.java

public class MainActivity extends AppCompatActivity {

    private EditText main_Editext;
    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main_Editext = (EditText) findViewById(R.id.main_Editext);

        //实例化一个intent
        intent = new Intent();
        //设置广播名字(设置Action)
        intent.setAction("android20_sender.955");
    }
    public void send(View view){
        //得到文本数据
       String content= main_Editext.getText().toString();
        //intent携带数据
        intent.putExtra("content",content);
        //发送广播(无序)
        sendBroadcast(intent);
    }
}

发送者我们就写完了。

接受者01号:
兴建一个项目anjie_android_20broatcast_received01
兴建java类:Received01
这里写图片描述

自定义广播接收器需要继承基类BroadcastReceivre,并实现抽象方法onReceive(context, intent)方法。广播接收器接收到相应广播后,会自动回到onReceive(..)方法。默认情况下,广播接收器也是运行在UI线程,因此,onReceive方法中不能执行太耗时的操作。否则将因此ANR。一般情况下,根据实际业务需求,onReceive方法中都会涉及到与其他组件之间的交互,如发送Notification、启动service等。

public class Received01 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //判断电台发送者是不是android20_sender.955
        if ("android20_sender.955".equals(intent.getAction())){
            //获取接收的数据
            String content=intent.getStringExtra("content");
            Log.i("test","01号接受者收到了广播:"+content);
        }
    }
}

配置清单文件 :AndroidManifest.xml

     <!--配置广播接收者
            1、在清单文件中配置(静态)
            2、使用java代码配置(动态)
        -->
<receiver android:name=".Received01">
    <intent-filter>
        <action android:name="android20_sender.955"></action>
    </intent-filter>

</receiver>

接受者02号:
兴建一个项目anjie_android_20broatcast_received02
兴建java类:Received02
跟anjie_android_20broatcast_received02相同的操作这里就不说了……

运行三个项目看结果:
这里写图片描述

好了静态广播就成功了!

现在我们把Received02改为动态广播:
先把清单文件里面的 配置广播接收者 代码 删掉
通过java代码来配置:
在anjie_android_20broatcast_received02:MainActivity中重写onResume方法让他一启动就调用配置重点内容

public class MainActivity extends AppCompatActivity {

    private Received02 received02;
    private IntentFilter intentFilter;

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

        received02 = new Received02();
        intentFilter = new IntentFilter();
        intentFilter.addAction("android20_sender.955");

    }

    @Override
    protected void onResume() {
        super.onResume();
        //动态注册广播
        registerReceiver(received02,intentFilter);
    }

    //动态广播必须注销否则会报错
    // 重写onDestroy方法
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //注销动态广播
        unregisterReceiver(received02);
    }
}

运行结果:
这里写图片描述

由此看出:
动态广播的优先级高于静态
如果动态广播(Received02)退出 则不能接受广播
静态是否退出都能接受

有序广播:
我们只需要改一点
在发送者MainActivity中更改

//发送广播(有序)
  sendOrderedBroadcast(intent,null);

有序广播优先级-1000~1000(无序没有)
两种方式:
清单文件配置 intent-filter 标签中添加android:priority=”999”

<intent-filter
    android:priority="999"
                >
java代码配置

这里写图片描述

取消广播传播 : abortBroadcast();

有序广播就可以了!

补充:
黏性广播(过时)作为了解 sendstickyBroadcast(intent) 黏性广播需要权限 <uses-permission android:name="android.permission.BROADCAST_STICKY">

常用广播:http://blog.csdn.net/anjiepursue/article/details/54914631

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值