首页 > 系统 > Android > 正文

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

2019-11-09 17:26:34
字体:
来源:转载
供稿:网友

首先什么是广播: 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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表