BroadcastReceiver与LocalBroadcastManager应用及区别

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


一、应用场景

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

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

二、安全

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

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

三、例子

BroadcastReceiver示例代码:

<span style="font-size:18px;"><span style="font-size:18px;">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();
    }
}</span></span>
<span style="font-size:18px;">
</span>
<strong><span style="font-size:18px;">AndroidManifest.xml</span></strong>
<pre name="code" class="html"><span style="font-size:18px;"><receiver android:name=".BroadcastReceiverTest$MyBroadcastReceiver">
            <!--加上此句会重复调用
            <intent-filter>
                <action android:name="com.zfeng.broadcastreceiver"/>
            </intent-filter>-->
        </receiver></span>


 

LocalBroadcastManager例子:

<span style="font-size:18px;">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);
    }
}</span>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值