BroadcastReceiver与LocalBroadcastManager应用及区别
16lz
2021-01-26
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); }}
更多相关文章
- Android(安卓)6.0事件分发机制源码解析
- 基于power supply信息传递的uevent机制
- 第一章:初入Android大门(不同的Activity之间的数据传递与回调--s
- chromium-cronet库的编译用于Android和ios平台实现quic协议
- Android(安卓)常用mimeType表
- Android(安卓)之最新最全的Intent传递数据方法
- android之电话号码查询
- Android---回调机制小例子
- android中的application