android中有两种广播机制,一种是BroadcastReceiver,另一种是LocalBroadcastManager。现在来简单介绍一下两者。


一、应用场景

   1、BroadcastReceiver用于应用之间的传递消息;

   2、而LocalBroadcastManager用于应用内部传递消息,比broadcastReceiver更加高效。

二、安全

   1、BroadcastReceiver使用的Content API,所以本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用;

   2、LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效。

三、例子

BroadcastReceiver示例代码:

public class BroadcastReceiverTest  extends AppCompatActivity{    static int flag=1;    static final String NAME="name";    static final String ACTION="com.zfeng.broadcastreceiver";    private Button startBtn;    private MyBroadcastReceiver myBroadcastReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.broadcast_layout);        myBroadcastReceiver=new MyBroadcastReceiver();        startBtn=(Button)findViewById(R.id.broadcast_start);        addListener();    }    @Override    protected void onResume() {        super.onResume();        registerReceiver(myBroadcastReceiver,new IntentFilter(ACTION));    }    @Override    protected void onPause() {        super.onPause();        unregisterReceiver(myBroadcastReceiver);    }    private void addListener()    {        startBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent();                intent.setAction(ACTION);                intent.putExtra(NAME,"Andy");                sendBroadcast(intent);            }        });    }    public static class MyBroadcastReceiver extends BroadcastReceiver    {        @Override        public void onReceive(Context context, Intent intent) {            String name=intent.getStringExtra(NAME);            Toast.makeText(context,name+":"+flag,Toast.LENGTH_SHORT).show();            ++flag;        }    }    @Override    protected void onDestroy() {        super.onDestroy();    }}
AndroidManifest.xml
                    


   

LocalBroadcastManager例子:

public class MainActivity extends AppCompatActivity{    static final String COMMAND="command";    static final String ACTION_STARTED="com.zfeng.broadcastreceiver.STARTED";    static final String ACTION_UPDATE="com.zfeng.broadcastreceiver.UPDATE";    static final String ACTION_STOPPED="com.zfeng.broadcastreceiver.STOPPED";    static final int FLAG_STARTED=1001;    static final int FLAG_UPDATE=1002;    static final int FLAG_STOPPED=1003;    private LocalBroadcastManager mLocalBroadcastManager;    private BroadcastReceiver mBroadcastReceiver;    private Button startBtn,updateBtn,startActivityBtn;    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);        startBtn=(Button)findViewById(R.id.content_start);        updateBtn=(Button)findViewById(R.id.content_update);        startActivityBtn=(Button)findViewById(R.id.content_activity);        tv=(TextView)findViewById(R.id.content_tv);        IntentFilter intentFilter=new IntentFilter();        intentFilter.addAction(ACTION_STARTED);        intentFilter.addAction(ACTION_UPDATE);        intentFilter.addAction(ACTION_STOPPED);        mBroadcastReceiver=new BroadcastReceiver() {            @Override            public void onReceive(Context context, Intent intent) {                if(intent.getAction().equals(ACTION_STARTED))                {                    tv.setText("STARTED");                }else if(intent.getAction().equals(ACTION_UPDATE))                {                    tv.setText("UPDATE");                }else if(intent.getAction().equals(ACTION_STOPPED))                {                    tv.setText("STOPPED");                }            }        };        mLocalBroadcastManager.registerReceiver(mBroadcastReceiver,intentFilter);        addListener();    }    private void addListener()    {        startBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent();                intent.setClass(MainActivity.this,LocalService.class);                intent.putExtra(COMMAND,FLAG_STARTED);                startService(intent);            }        });        updateBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent();                intent.setClass(MainActivity.this,LocalService.class);                intent.putExtra(COMMAND,FLAG_UPDATE);                startService(intent);            }        });        startActivityBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent();                intent.setClass(MainActivity.this,BroadcastReceiverTest.class);                startActivity(intent);            }        });    }    public static class LocalService extends Service    {        LocalBroadcastManager localBroadcastManager;        private Handler handler=new Handler()        {            @Override            public void handleMessage(Message msg)            {                if(msg.what==FLAG_STARTED)                {                    localBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED));                }else if(msg.what==FLAG_UPDATE)                {                    localBroadcastManager.sendBroadcast(new Intent(ACTION_UPDATE));                }            }        };        @Override        public void onCreate() {            super.onCreate();            localBroadcastManager=LocalBroadcastManager.getInstance(this);        }        @Override        public int onStartCommand(Intent intent, int flags, int startId)        {            int command=intent.getIntExtra(COMMAND,FLAG_STARTED);            handler.sendEmptyMessageDelayed(command,3000);            return ServiceCompat.START_STICKY;        }        @Override        public void onDestroy() {            super.onDestroy();            localBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED));        }        @Nullable        @Override        public IBinder onBind(Intent intent) {            return null;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);    }}






更多相关文章

  1. Android(安卓)6.0事件分发机制源码解析
  2. 基于power supply信息传递的uevent机制
  3. 第一章:初入Android大门(不同的Activity之间的数据传递与回调--s
  4. chromium-cronet库的编译用于Android和ios平台实现quic协议
  5. Android(安卓)常用mimeType表
  6. Android(安卓)之最新最全的Intent传递数据方法
  7. android之电话号码查询
  8. Android---回调机制小例子
  9. android中的application

随机推荐

  1. adobe air android INSTALL_FAILED_INVAL
  2. Android(安卓)Nine-patch(.9.png)小结
  3. raspberryPi2 移植Android系统
  4. eclipse 和 android studio 快捷键对比
  5. 利用adb安装和卸载android APK
  6. Android中文API(97)—— ContextMenu
  7. UiModeManager设置夜间模式和行车模式
  8. unity3d 保存(截图、拍照)图片 到Android(
  9. 几个Android常见wraning警告处理方法
  10. 轻松玩转Camera,使用CameraView来拍照,修