广播接收者(2)

来源:互联网 发布:软件poc产品 编辑:程序博客网 时间:2024/06/13 07:20

参考郭霖的书

发送自定义广播

  1. 在发广播之前,我们先定义一个广播接收器来接收此广播才行。因此,新建一个类:MyBroadcastReceiver,让他继承BroadcastReceiver,代码如下:
public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();    }}

这里,当MyBroadcastReceiver 收到自定义的广播时,就会执行onReceive()方法中的逻辑,弹出一个Toast。
紧接着,要在清单文件AndroidManifest.xml中对这个广播接收器进行注册。

    <application         android:allowBackup="true"        android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme" >        <activity           android:name="com.example.m05_broadcastreceiver02.MainActivity"            android:label="@string/app_name" >              <intent-filter>                 <action android:name="android.intent.action.MAIN" />                 <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>         <receiver android:name=".MyBroadcastReceiver">            <intent-filter >               <action android:name="com.example.m05_broadcastreceiver02.MY_BROADCAST"/>             </intent-filter>        </receiver>    </application>
 Button button1=(Button)findViewById(R.id.button1);        button1.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                Intent intent =new Intent("com.example.m05_broadcastreceiver02.MY_BROADCAST");                sendBroadcast(intent);            }        });

可以看到,点击按钮时,发送com.example.m05_broadcastreceiver02.MY_BROADCAST这条广播,这样,所有能够监听com.example.m05_broadcastreceiver02.MY_BROADCAST这条广播的广播接收器就都会同时收到消息,此时发出去的就是一条标准广播,即无序广播。

  1. 发送有序广播:

广播是一种可以跨进程的通信方式,其他应用程序是可以收到的。现在我们来发一条有序广播。

有序广播不仅有先后顺序,而且前面的广播还可以将后面的广播截断。

 Intent intent =new Intent("com.example.m05_broadcastreceiver02.MY_BROADCAST");            sendOrderedBroadcast(intent, null);
<receiver android:name=".MyBroadcastReceiver">            <intent-filter android:priority="100">                <action android:name="com.example.m05_broadcastreceiver02.MY_BROADCAST"/>            </intent-filter>        </receiver>

abortBroadcast();//拦截广播,防止后面的接收到

特别关注:

广播接收器的生命周期:关键在于BroadcastReceiver中的onReceive()方法,从onReceive()里的第一行代码开始,onReceive()里的最后一行代码结束。
一个广播到来的时候,用什么方式提醒用户是最友好的呢?第一种方式是吐司,第二种方式是通知

使用本地广播

之前我们发送和接收的广播全部都是属于全局广播,即发出去的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样一来,必然会造成安全问题。于是便有了本地广播:即只能在本应用程序中发送和接收广播。这就要使用到了LocalBroadcastManager这个类来对广播进行管理。注:不要使用对话框,以免中断了用户正在进行的操作。

public class MainActivity extends Activity {    private IntentFilter intentFilter;    private LocalReceiver localReceiver;    private LocalBroadcastManager localBroadcastManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //通过LocalBroadcastManager的getInstance()方法得到它的一个实例        localBroadcastManager = LocalBroadcastManager.getInstance(this);        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(                        "com.example.broadcasttest.LOCAL_BROADCAST");                localBroadcastManager.sendBroadcast(intent);//调用sendBroadcast()方法发送广播            }        });        //动态注册本地的广播接收器        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");        localReceiver = new LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver, intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        localBroadcastManager.unregisterReceiver(localReceiver);    }    class LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "received local broadcast",                    Toast.LENGTH_SHORT).show();        }    }}
0 0