http://blog.csdn.net/knightaoko/article/details/62423919
//数据存储的博客
------------------------------------------------------------------------------------
今天看了两章《第一行代码》---完全代码实现了一章的内容。-
-------------------------------Start-----------------------------------------------
开启搬运工模式:广播机制的简介
安卓提供一套完整的API,允许应用程序自由的发送和接受广播。
广播有两种类型:1.标准广播:发一条消息,接收器同时接受【异步执行?】;2.有序广播:发一条消息,接收器按照优先级传递【同步执行?】
-------系统广播
Android内置了很多系统级别的广播,可以在应用程序中通过监听这些广播从而获取到系统状态。
广播的实现步骤:顾名思义--广播,首先需要一个广播源发送内容,再有一个接受器接收广播发送的内容。
发送广播消息:sendBroadcast(Intent intent)
接受器receiver:首先需要编写一个类继承BroadcastReceiver实现onReceive()的方法---这个方法作用就是接收到广播后做出什么反应
看似到现在就完成了,但是想一下如果有很多个广播消息的话,接收器怎么判断执行什么操作?
这个就需要Intent来作为介质传输,需要做的就是给Intent做出独特的标记就好【在这里面做的就是设置action的值】
!!!还有一个很重要的事情就是需要注册Receiver!!!!!!!!!!!!
-------------------------------------使用本地广播------------------------------------------------------------------
本地广播:首先使用LocalBroadcastanager对广播进行管理,并提供了发送广播和注册广播接收器的方法。
public class MainActivity extends AppCompatActivity{
private InterFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
class LocalReceiver extends BroadcastReceiver{
public void onReceive(Context context,Intent intent ){
Toast.makeText(context,"",Toast.LENGTH_SHORT).show();}
}
public void onCreate(Bundle savecInstanceState){
super.onCreate(savecInstanceState);
setContentView(R.layout.main_activity);
localBroadcastManager=LocalBroadcastManager.getInstance(this);
Button button=(BUtton)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent=new Intent("com.example.symble");
localBroadcastManager.sendBroadcast(intent); //发送广播
}});
intentFilter=new IntentFilter();
intentFilter.setAction("com.example.symble");
loaclReceiver=new Receiver();
localBroadcastManager.registerReceiver(localReceiver , intentFilter); //注册广播监听器
}
都是一些基本代码,很简单。
--------------------------------广播的最佳实践---------强制下线功能-----------------------------------------
第一步:这个功能需要关闭所有的活动,也就是说我们需要一个类来控制所有的活动----ActivitrCollector
public static List<Activity> activities=new ArrayList()<>; //需要获取到在强制退出前已经出现过的activity然后对这些对象进行操作
addActivity(Activity activity) removeActivitr(Activity activity) finishAll()
第二步:让项目的活动继承一个基类BaseActivity【自己创建】--主要目的在于用自定义了ActivityCollector类,来管理activity。
---具体的就是在重写的onCreate()里面在添加一个addActivity(),然后再onDestroy()里面添加一个removeActivity()
这个当然是一个很浅显的东西【在不考虑广播的接受之前】,当你需要考虑广播接收的时候,或许会想---我需要点击一个按钮或者其他的一个事件触发发送一条广播,让所有的activity都接受到,那么也就是说需要在每一个activity的java文件里面都先要实现一个receiver然后再接收相同的消息。【如果真的是这样做的,代码量将是一场灾难--特别是在活动多的时候】,或许就是这种时候继承的作用就体现的很明确了。我只需要在父类实现接收器的方法就好了。
BaseActivity 一个内部类ForceofflineReceiver:
public ForceOfflineReceiver extends BroadcastReceiver{
public void onReceive(Context context , Intent intent){
AlertDialog.BUilder builder=new AlertDIalog.Builder(ciontext);
builder.setTItle("warning");
builder.setCancelable(false);
bulider.setPositiveButton("OK",new DIalogInterface.OnclickListener(){
public void onClick(DialogInterface dialog, int which){
ActivityCollector.finishAll();
Intent intent=new Intent(context, LoginActivity.class);
startActivity(intent);
}});
bulider.show();}}}
}
然后在onSume()函数里注册接收器------需要两个部分:recevier 和 过滤器intentFilter
onResume(){
super.onResume();
IntentFilter intentFilter=new IntentFIlter();
IntentFilter.addAction("");
receiver =new ForecOfflineReceiver();
registerReceiver(receiver , intentFilter); //注册完就能起作用了
}
为了保证内存泄漏的问题:在onPause()里面取消receiver的注册
onPause(){
if(receiver!=NULL){
unregisterReceiver(receiver);}} //完成了
第三步:你现在需要发广播消息---直接在onClick()事件里面sendBroadcast(intent) 大功告成
--------------------------------------------完结---------------------------------------------