Android广播机制包含三个基本要素:广播(Broadcast) - 用于发送广播;广播接收器(BroadcastReceiver) - 用于接收广播;意图内容(Intent)-用于保存广播相关信息的媒介。Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
1.建二个项目,第一个为发送者
布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: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:orientation="vertical" tools:context="com.zking.g150831_android20.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入广播内容" android:id="@+id/main_send"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送" android:onClick="OK"/> </LinearLayout>java代码,粘性广播一般用于动态广播,因为动态广播的activity关掉后,广播就失效了也就接受不到消息了,而用了粘性广播后在动态广播重新开始的时候就能接受到之前的消息了。
package com.zking.g150831_android20; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private EditText main_send; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); main_send = (EditText) findViewById(R.id.main_send); intent = new Intent(); //设置广播的名字(设置Action,注意名字前面必须带上包名) intent.setAction("com.zking.g150831_android20.985211"); } public void OK(View view){ String text=main_send.getText().toString(); //携带数据 intent.putExtra("data",text); //发送广播(无序) // sendBroadcast(intent); //发送黏性广播 // sendStickyBroadcast(intent); //发送有序广播 //这里的第二个参数是设置权限,如果接收者有这个权限才可 // 以收到消息,参数为null就是所有的接收者都可以收到消息 sendOrderedBroadcast(intent,null); } }
如果使用粘性广播的话要在配置清单里面添加权限
<!--添加发送黏性广播的权限--> <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>
2.第二个项目,接收者
直接建个java文件,继承BroadcastReceiver这个内
public class Myaccept01 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("com.zking.g150831_android20.985211".equals(intent.getAction())){ String data=intent.getStringExtra("data"); Log.i("哈哈","1号收到了"+data); if ("中奖了".equals(data)){ //阻止广播继续传播 abortBroadcast(); } } } }在AndroidManifest.xml文件中的<application>标签内加入下面代码
<receiver android:name=".Myaccept01"> <!--给静态广播设置优先级priority--> <intent-filter android:priority="999"> <action android:name="com.zking.g150831_android20.985211"></action> </intent-filter> </receiver>
如果你要用动态广播的话就不用在清单文件中配置了
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private Myaccept01 myaccept01; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 配置广播接收者 // 1.在清单文件中配置(静态广播) // 2.使用java代码配置(动态广播),动态广播的优先级要高于静态广播 myaccept01 = new Myaccept01(); intentFilter = new IntentFilter(); intentFilter.addAction("com.zking.g150831_android20.985211"); //给动态广播设置游戏机 //优先级的值为-1000到1000,值越大优先级越高 intentFilter.setPriority(998); } @Override protected void onResume() { super.onResume(); //动态注册广播 registerReceiver(myaccept01,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //注销动态广播 unregisterReceiver(myaccept01); } }