首页 > 学院 > 开发设计 > 正文

BroadcastReceiver(无序广播)

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

       今天了解了BroadcastReceiver,也就是广播接收者,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在方方面面,比如说开机、电量改变、收发短信、拨打电话、屏幕解锁等等。

现在我来演示一下创建BroadcastReceiver,并且能够接收我们所需要的消息。我们先建一个sender(发送端)的项目,写一个发送端的界面,界面代码如下:<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context="com.example.smz.a0831_android_sender.MainActivity"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入广播内容"android:id="@+id/et_main_content"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送"android:onClick="send"/></LinearLayout>public void send(View view){String content=et_main_content.getText().toString();intent.putExtra("data",content);//发送广播(无序广播)sendBroadcast(intent);}发送端我们写好了现在我们写接收端,我们首先创建一个广播接收者,名为MyReceived01:public class MyReceived01 extends BroadcastReceiver {@Overridepublic voidonReceive(Context context, Intent intent) {if("com.example.smz.a0831_android_sender.955".equals(intent.getAction()));String data=intent.getStringExtra("data");Log.i("test","01号接收者收到广播:"+data);}第二步:注册BroadcastReceiver一旦实现了BroadcastReceiver,接下就应该指定该BroadcastReceiver能匹配的Intent即注册BroadcastReceiver。注册BroadcastReceiver的方式有两种:(动态广播的优先级比静态要高)第一种是静态注册:这种方法是在配置AndroidManifest.xml配置文件中注册,通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发程序还是会被系统自动调用运行。例如:<!-- 在配置文件中注册BroadcastReceiver能够匹配的Intent --><!--配置广播接收者--><receiver android:name=".MyReceived01"><intent-filter><action android:name="com.example.smz.a0831_android_sender.955"></action></intent-filter></receiver>配置完了后,只要是com.example.smz.a0831_android_sender.955这个地址的广播,MyReceived01都能接收到。注:这里我写两个接收端,两个接收端代码都差不多,只需要改下命名即可)。第二种: 动态注册:public classMainActivityextendsAppCompatActivity {PRivate MyReceived02 myReceived02;private IntentFilter intentFilter;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myReceived02 = new MyReceived02();intentFilter = new IntentFilter();intentFilter.addAction("com.example.smz.a0831_android_sender.955");}@Overrideprotected voidonResume() {super.onResume();//注册广播registerReceiver(myReceived02,intentFilter);}注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作://注销@Overrideprotected voidonDestroy() {super.onDestroy();unregisterReceiver(myReceived02);}黏性广播:它分为有序黏性和无序黏性,它只需要在发送端写如下代码//发送黏性广播sendStickyBroadcast(intent);就好了。然后在添加一个黏性个广播的权限即可<!--添加发送黏性广播权限--><uses-permissionandroid:name="android.permission.BROADCAST_STICKY"></uses-permission>        


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