Android中使用LocalBroadcastManager发送进程内广播
分类:Android, Java
阅读 (2,924)
Add comments
3月 182016
LocalBroadcastManager是support v4包里提供的一个组件,它只负责进程内发送广播和接收消息,它的优点如下:
- 广播消息只在进程内发送,不会造成数据泄露
- 只接收进程内的广播消息,不会有广播方面的安全问题
- 比全局的广播效率更高
LocalBroadcastManager的实现原理:我们通常都是通过LocalBroadcastManager.getInstance(Context context)来获得它的实例的,通过查看LocalBroadcastManager的代码,笔者发现它的实现并不复杂,它其实是一个单实例对象,那么我们在整个进程内使用的其实是一个LocalBroadcastManager对象,这个单实例对象负责注册消息和分发消息。
了解了一下它的原理,下面我们就用一个小demo来使用一下它吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 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" tools:context="com.example.administrator.androidtest.LocalBroadCastMgrActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/tvReceiver" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" android:id="@+id/button24" android:layout_below="@+id/tvReceiver" android:layout_centerHorizontal="true" android:layout_marginTop="94dp" android:onClick="onBtnSendClick" /> </RelativeLayout> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
package com.example.administrator.androidtest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class LocalBroadCastMgrActivity extends Activity { LocalBroadcastManager localBroadcastManager; MyMsgReceiver myMsgReceiver; TextView tvReceiver ; public static String BROADCAST_ACTION = "com.bcoder.test.localbroadcast"; public static String INTENTEXTRA_MYWEBSITE = "mywebsite"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_local_broad_cast_mgr); tvReceiver = (TextView) findViewById(R.id.tvReceiver); } @Override protected void onStart() { super.onStart(); myMsgReceiver = new MyMsgReceiver(); IntentFilter intentFilter = new IntentFilter(BROADCAST_ACTION); localBroadcastManager = LocalBroadcastManager.getInstance(this); //注册广播消息接收器 localBroadcastManager.registerReceiver(myMsgReceiver, intentFilter); } @Override protected void onStop() { //删除已注册的广播 localBroadcastManager.unregisterReceiver(myMsgReceiver); super.onStop(); } public void onBtnSendClick(View v){ Intent intent = new Intent(BROADCAST_ACTION); intent.putExtra(INTENTEXTRA_MYWEBSITE, "http://svn1.bcoder.com"); //在其他Activity或者服务中使用时可以直接使用LocalBroadcastManager.getInstance,不用再定义变量 LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } //定义自己的广播接收类 class MyMsgReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(null != intent && null != intent.getStringExtra(INTENTEXTRA_MYWEBSITE)){ tvReceiver.setText(String.format("我的网站: %s", intent.getStringExtra(INTENTEXTRA_MYWEBSITE))); } } } } |
注意事项:
- Android桌面组件和app不在一个进程内,不能使用LocalBroadcastManager进行广播
- LocalBroadcastManager注册的消息只有使用LocalBroadcastManager发送才能接收到,同样LocalBroadcastManager发出的消息只有它注册的消息才能接收
- LocalBroadcastManager和全局广播可以同时使用,以便于和其它的app进行通讯