当前位置: 代码迷 >> Android >> 安卓四大组件之一-Broadcast
  详细解决方案

安卓四大组件之一-Broadcast

热度:119   发布时间:2016-04-28 00:35:53.0
安卓四大组件之一-------Broadcast


????????????? 对于activity我们已经有了一定的了解了,但对于安卓的四大组件之一的Broadcast我们似乎没接触过。其实每天我们都在和它打交道,还记得这张图片吗?

??????????????? 每当没网时,我们有没有想过手机怎么知道没网了呢?这一切等了解Braoadcast后,你就会明白了。

??????????????? 安卓有一套完整的API,可以让用户自由接收和发送广播。接收广播需要广播接收器,而发送广播需要使用intent。Intent在前面我们已经接触过了,就不详细介绍了,待会直接看代码。那么就来看看广播接收器了。

??????????????? 广播接收器怎么用呢?怎么创建一个广播接收器呢?其实很简单。

????????? 1.动态注册监听网络的变化

????????? 新建一个内部类NetworkChangeReceiver,并继承BroadcastReceiver。代码如下:

public class MainActivity extends Activity {	private NetworkChangeReceiver networkChangeReceiver;	private IntentFilter intentFilter;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		intentFilter = new IntentFilter();		intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");		networkChangeReceiver = new NetworkChangeReceiver();//创建广播接收器实例		registerReceiver(networkChangeReceiver, intentFilter);//注册网络监听广播        		findViewById(R.id.send).setOnClickListener(new View.OnClickListener(){			@Override			public void onClick(View arg0) {				Intent intent=new Intent("android.app.action.ACTION_PASSWORD_FAILED");				sendBroadcast(intent);			}					});	}	@Override	public boolean onCreateOptionsMenu(Menu menu) {		getMenuInflater().inflate(R.menu.main, menu);		return true;	}	class NetworkChangeReceiver extends BroadcastReceiver {		@Override		public void onReceive(Context context, Intent intent) {			ConnectivityManager connectionManager = (ConnectivityManager)					getSystemService(Context.CONNECTIVITY_SERVICE);			NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();			if (networkInfo != null && networkInfo.isAvailable()) {				Toast.makeText(context, "network is available",						Toast.LENGTH_SHORT).show();			} else {				Toast.makeText(context, "network is unavailable",						Toast.LENGTH_SHORT).show();			}		}	}	@Override	protected void onDestroy() {		super.onDestroy();		unregisterReceiver(networkChangeReceiver);//注销此网络监听广播	}}

??????????? 动态注册需要在onCreate方法中动态注册,并且要在onDestroy方法中销毁。当网络链接情况改变时,监听端口就会收到对应广播信号,onReceive方法就会调用。网络链接情况的改变是由安卓系统监控的,因此我们只要在程序中对它监听了,网络链接情况的改变时,系统就会发送广播,监听他的程序就会收到广播。

???????? 是不是有了上述代码,程序就可以正常运行了呢?答案是否定的。这涉及到一个权限问题,程序要访问系统的网络状况,必须要有权限注册代码,下面这是访问网络的权限代码,要在AndroidManifest.xml中添加这一行

????????????? <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

??

????????? 2、静态注册

?????????? 静态注册时,我们要创建一个类BootCompleteReceiver继承BroadcastReceiver,并重写onReceive方法,除此之外,我们还要在AndroidManifest.xml中注册

?

?

<receiver android:name="com.example.learningtest1_broadcast.BootCompleteReceiver"            >            <intent-filter >                <action android:name="android.app.action.ACTION_PASSWORD_FAILED"/>            </intent-filter>        </receiver>

?这样,也可以监听接收对应的广播。

?

?

  相关解决方案