广播安全:由于之前的广播都是全局的,所有应用程序都可以接收到,这样就很容易会引起安全性的问题,比如说我们发送一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播,这样所有的安全性问题就都不存在了。
2.2 核心用法
使用LocalBroadcastManager来管理广播:
调用LocalBroadcastManager.getInstance()来获得实例
调用xx.registerReceiver()来注册广播
调用xx.sendBroadcast()发送广播
调用xx.unregisterReceiver()取消注册
2.3 注意事项
本地广播无法通过静态注册来接收,相比起系统全局广播更加高效
private void sendTitleChangeIntent(){
Intent intent=new Intent(CollectListActivity.CollectTitleChange);
getActivity().sendBroadcast(intent);
}
贴码直观
package com.fpt.mybroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button btnOrderlyBroadcast;
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOrderlyBroadcast=findViewById(R.id.Btn);
btnOrderlyBroadcast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {//该方法运行后,直接调用LocalReceiver.onReceive();
Intent intent = new Intent("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
intentFilter = new IntentFilter();
intentFilter.addAction("com.nyl.orderlybroadcast.AnotherBroadcastReceiver");
localReceiver = new LocalReceiver();
//注册本地接收器
localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注册广播
}
});
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取广播实例赋值对象
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);//取消广播
}
private class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到本地广播", Toast.LENGTH_SHORT).show();
}
}
}