Android(java)学习笔记94:关于广播接收者的注册和使用心得

时间:2023-03-09 08:15:20
Android(java)学习笔记94:关于广播接收者的注册和使用心得

1. 下面我们先看一部分代码,由代码进行进一步的深入:

  registerReceiver( new BroadcastReceiver() {//onReceive中代码的执行时间不要超过5s,android会弹出超时dialog
public void onReceive(Context paramContext, Intent paramIntent)//context :用来获得应用程序信息;Intent:负责所有Activity窗口通讯
{ //ScanResult这个类是用来描述接入网络的信息的,比如:SSID、BSSID、capabilities等等
List<ScanResult> localList = MainActivity.this.wifi.getScanResults();//用来获得手机扫描到的所有wifi的信息
if (localList.size() < 1)//判断List中的元素的个数。localList.size() <1:表示List没有元素,元素的个数表示:搜索到无线网络个数
{
MainActivity.this.connectBtn.setEnabled(false);
Toast.makeText(MainActivity.this.getApplicationContext(), "没有找到无线网络", 1).show();
return;
}
Spinner localSpinner = (Spinner)MainActivity.this.findViewById(R.id.spinner1);//Spinner组件组要用显示一个下拉列表,Spinner的重点问题就是下拉列表项的配置,对它的配置需要使用Adapter类的实现。
ArrayList localArrayList = new ArrayList();//ArrayList是数组类型的集合
Iterator<ScanResult> localIterator = localList.iterator();//实例化localIterator 为元素列表的迭代器。 //在android中,Spinner是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把Spinner绑定到ArrayList上,
//通过ArrayAdapter来使Spinner显示和刷新内容
while (true)
{
if (localIterator.hasNext())
{
//配置spinner控件展现样式,spinner只是承载多项数据,下面是以何种方式展现这些数据
ArrayAdapter<ScanResult> localArrayAdapter = new ArrayAdapter<ScanResult> (MainActivity.this.getApplicationContext(), android.R.layout.simple_spinner_item, localArrayList);
localArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); /* setAdapter:Adapter(适配器)用于提供数据支持这种Spinner
**就是为Spinner 放置适配器
*/
localSpinner.setAdapter(localArrayAdapter);
localSpinner.setPrompt("请选择搜索到网络:");
MainActivity.this.connectBtn.setEnabled(true);
return;
}
localArrayList.add(((ScanResult)localIterator.next()).SSID);
}
}
} //我们这里订阅的是SCAN_RESULTS这个广播,我们注册的广播接收器registerReceiver就是监听这个广播包含的Intent
, new IntentFilter("android.net.wifi.SCAN_RESULTS")) ;

首先,我们要明白一个道理,那就是出现广播接收者原因,如下:

在android里面有各种各样的广播,比如电池的使用状态电话的接受短信的接受都会产生一个广播,应用程序也可以接受广播并做出程序逻辑上的处理

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。

这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。

广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。
Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

广播接收器BroadcastReceiver
BroadcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,并且广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试是否收到短信,这时候就可以定义一个BraodcastReceiver来接受广播,当收到短信时提示用户。

我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。
我们也可以在自己的应用程序中开发BroadcastReceiver,然后把广播接收器这个类或者对象注册到Android操作系统上去,让操作系统知道现在有这样一个广播接收器正在等待接收Android操作系统的广播,即在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。
当有广播事件产生时,Android操作系统首先告诉注册到其上面的广播接收器产生了一个怎么样的事件,每个接收器首先判断是不是我这个接收器需要的事件,如果是它所需要的事件,再进行相应的处理。

例子:我们把骚扰电话的黑名单放到数据库中去,当接到电话时会产生一个接电话事件,事先在Android操作系统中注册一个BroadcastReceiver的对象,当产生事件的时候,会通知我们的广播接收器对象,接收器对象接收到消息之后,就会到数据库里面去取所有黑名单电话和接到的这个电话号码进行比较,如果匹配就直接挂掉。