android四大组件总结之BroadcastReceiver个人总结

1.动态注册

以郭神的第一行代码里的示范为例子

package com.Harris.broadcastreceiver_demo;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
	private NetworkChangeReceiver networkChangeReceiver;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity);
		//这个程序用于监听系统发出的广播
		//需要在onCreate方法里面生成一个IntentFilter对象
		//给这个对象一个监听的目标,addAction
		
		IntentFilter intentFilter = new IntentFilter();
		IntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
		networkChangeReceiver = new NetworkChangeReceiver();
		registerReceiver(networkChangeReceiver, intentFilter);

	}

	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(networkChangeReceiver);
	}
	//这是一个继承自BroadcastReceiver的内部类
	//成员内部类的修饰符可以是public、protected、private、abstract、final和static
	//这个自定义的Receiver就是用来指定在接收到了IntentFilter里面指定的广播后要去做什么的
	//BroadcastReceiver是一个抽象类,onReceive是唯一的抽象方法
	class NetworkChangeReceiver extends BroadcastReceiver {

		public void onReceive(Context context, Intent intent) {
			Toast.makeText(context, "NetWork status Changed", Toast.LENGTH_SHORT).show();
		}

	}

}
//最后还需要提醒一句,需要在onDestory方法里unRegisterReceiver这个Receiver,否则退出时会报错。
注释写的很清楚,需要一个自定义的Receiver extends BroadcastReceiver,在这个Receiver的onReceive方法里面写好收到广播后要做的事情

使用时注意将这个Receiver和intentFilter一起传入registerReceiver的参数里,其实也就是Receiver和IntentFilter搭配使用。

最后,这个Activity由于会监控系统网络状态,所以需要在AndroidManifest文件里添加权限,这个知道就行。



2.静态注册

个人理解就是把IntentFilter写在AndroidManifest文件的<receiver/>标签里面

这样用来干活的Receiver就可以脱离主Activity了,当然上面的动态注册也可以不写成内部类,只是注册的逻辑写在了onCreate方法里

Androidanifest文件里面的格式如下:

 <receiver android:name=".NetWorkStatusMonitor" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

作为四大组件之一,receiver和activity在Manifest文件里的地位应该是平起平坐的,低于application

这里需要在src的package里面建一个NetWorkStatusMonitor的类,extends BroadcastReceiver,在onCreate方法里面写好相应的处理办法。

这个class去做什么事情与Activity无关。

区别于动态注册,IntentFilter已经写好了,不用在执行过程中(可能要在onCreate方法里)添加。

3.关于发送Broadcast的问题。

1和2讲的都是关于如何接受广播,现在讲讲广播的发送。

先讲关于标准广播

谈发送之前先建立一个接收器,不然发出去没人要。。。。

先建一个Receiver类继承自BroadcastReceiver,在onReceive方法里爱干嘛干嘛。

然后静态注册这条广播,确定它要接受的intent-Filter。

接下来就超级简单了,在onCreate或者onClick方法里面写上下面的逻辑,sendBroadcast就发出去了

Intent intent = new Intent("com.Harris.broadcastreceiver_demo.MY_BROADCAST");
sendBroadcast(intent);
或者

Intent intent = new Intent();
intent.setAction("com.Harris.broadcastreceiver_demo.MY_BROADCAST");
sendBroadcast(intent);
就可以了。注意,之所以叫做标准广播,是因为这个Broadcast是可以被其他Receiver接收到的,毫无秘密可言。

你在eclipse里面再新建一个项目,完全可以接收到这条广播,也就是说这玩意可以跨程序传播。


接下来是有序广播:

貌似很简单:

sendBroadcast(intent)改为sendOrderedBroadcast(intent,null)即可。

然后设置receiver的priority:

动态注册:intentFilter.setPriority(100);

静态注册:<intent-filter android:priority="100">

可以把这个intent看作是对Receiver的修饰:

在Receiver里面abortBroadcast就可以终止这条广播了。


4.使用本地广播

这里要用到LocalBroadcastManager。

具体语法:LocalBrocastManager = LocalBroadcastManager.getInstance(this);//获取实例

Intent intent = new Intent("com.Harris.XXXXXX.XXXXX");

LocalBroadcastManager.sendBroadcast(intent);//这样就发送出去广播了。

LocalReceiver localReceiver = new LocalReceiver();

IntentFilter intentFilter = new IntenFilter();

IntentFilter.addAction("com.Harris.XXX.XXX");

LocalBroadcastmanager.registerReceiver(laocalReceiver,intentFilter);//这样就完成了接收器的注册。

LocalReceiver extends BroadcastReceiver,onReceive方法里面随便写了。

需要强调,LocalBroadcastManager发送的广播只会在该应用程序内部传播,你新建一个项目是绝逼接收不到这个广播的。

还有,本地广播只能动态注册,不能静态注册

以下是郭神的解释:“另外还有一点需要说明,本地广播是无法通过静态注册的方式来接收的。其实这也完全
可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地
广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。

其实,在发送标准广播的时候新建一个项目B,安装到模拟器上面,MainActivity里面什么都不做,在这个项目里面新建一个extends BroadcastReceiver的 Receiver

在onReceive()方法里面写好Toast,这时候启动发送广播的项目A,发送出去广播后,项目A会Toast一次,项目B也会Toast一次,呵呵,尼玛项目B的onCreate方法根本还没启动好吧,所以说,在Manifest文件里注册了之后,就可以在程序未启动的情况下接收广播,大概明白了。


最后提取这篇文章最重要的语法:

发送

sendBroadcast(intent);

接收:

静态注册:在Manifest文件里写<intent-filter android:action= "com.Harris.xxx">

动态注册:registerBroadcast(myReceiver,intentFilter);

myReceiver extends BroadcastReceiver{

onReceive{

//这里请为所欲为

}

}

所有的代码来自郭神,谢郭神。

最后安利一个思维导图软件,

Mindjet MindManager,超级好看。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值