Android广播

 广播机制
1 . Adnroid的广播机制(以intent对象的形式广播出去)
Android系统已经写好了广播机制,在我们照相的时候系统会自动生成照相事件并广播出去。当来短信的时候,系统会自动生成一个短信事件并广播出去。许许多多的事件都是由Android系统自动广播出去。我们也可以自定义发送广播事件,通过sendBroadcast(intent itt)方法将一个广播事件发送出去。Android系统广播的时候不会关心你是否收得到消息、只负责广播出去,而且广播的对象只是在应用程序中注册了的广播接收器。我们要做的就是自定义广播接收器并将其注册给应用程序,在广播接收器中将接收到广播事件作出相应的处理。如果广播的事件并不是我们定义的广播接收器需要的事件类型,一般是会过滤掉不被接收。只有当广播事件和我们写的接收器定义的接收的事件类型一致的时候才会触发广播接收器。并且触发广播接收器的onReceive方法。当然我们自定义的广播接收器需要接受事件的类型是在XML清单文件的<intent-filter>中自己定义声明的或者自己在程序代码中定义一个IntentFilter对象然后通过对象的addAction()方法来自定义接收事件类型。然后我们需要将接收到的事件的处理代码写在onReceive方法中。自定义一个广播接收器有2个步骤:
1,我们自定义的广播接收器对象必须要继承BroadcastReceiver,然后重写onReceive方法,处理接收的数据的代码就写在这个方法里面。
2,将广播接收器注册到应用程序中。包括注册广播接收器监听的接收事件的类型。




 public class TestActivity extends Activity {
    /** Called when the activity is first created. */
private Button sendButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.testreceiver);
        sendButton = (Button)findViewById(R.id.sendButton);
        sendButton.setOnClickListener(new BroadcastListener());
    }
    class BroadcastListener implements OnClickListener{


@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_EDIT);
TestActivity.this.sendBroadcast(intent);
}
   
    }
}


public class TestReceiver extends BroadcastReceiver{


public TestReceiver(){
System.out.println("TestReceiver");
}
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceive");
}
}


广播接收器(BroadcasrReceiver)的注册方式有2种:


1,在AndroidManifest.xml 中使用<receiver>标签注册
<receiver android:name=".TextReceiver">   //注册的广播接收器的名字。
  <intent-filter>    //接收何种类型广播事件数据。    Filter:过滤器。
     <action android:name="android.intent.action.EDIT">
  </intent-filter>
</receiver>
在清单文件AndroidManifest.xml中注册的广播接收器发现事件匹配的时候就会工作起来
当调用完 onReceive方法的时候广播接收器的生命周期就结束了, 但是只要有广播过来、就会激活广播接收器类,创建一个新的对象出来并继续执行 onReceive方法。当然前提是事件匹配了。也就是说即使我们的应用程序关闭了,只要有广播过来,就会接收到,就会激活广播接收器。


2,在应用程序的代码中进行注册。这种注册方法会随着应用程序的关闭而关闭。也就是说只有当应用程序启动的时候,注册了广播接收器,才能收到广播事件,当应用程序关闭。广播监听器也会随着取消注册。我们也可以在应用程序代码中自定义解除注册。
注册:registerReceiver(receiver , filter)
取消注册:UnregisterReceiver(receiver);
下面的代码只是绑定和解除绑定的代码。发送广播事件的代码另外:


public class TestBC2Activity extends Activity {
    /** Called when the activity is first created. */
private Button registerButton = null;
private Button unregisterButton = null;
private SMSReceiver smsReceiver = null;

private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        registerButton = (Button)findViewById(R.id.register);
        registerButton.setOnClickListener(new RegisterReceiverListener());
        unregisterButton = (Button)findViewById(R.id.unregister);
        unregisterButton.setOnClickListener(new UnRegisterReceiverListener());
    }
    
    class RegisterReceiverListener implements OnClickListener{


@Override
public void onClick(View v) {
//生成一个BroiadcastReceiver对象
smsReceiver = new SMSReceiver();
//生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);
//将BroadcastReceiver对象注册到系统当中
TestBC2Activity.this.registerReceiver(smsReceiver, filter);
}
   
    }
    
    class UnRegisterReceiverListener implements OnClickListener{


@Override
public void onClick(View v) {
//解除BroadcastReceiver对象的注册
TestBC2Activity.this.unregisterReceiver(smsReceiver);
}
   
    }
}
public class SMSReceiver extends BroadcastReceiver{


@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("receive message");

//接受Intent对象当中的数据
Bundle bundle = intent.getExtras();
//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 
//创建一个SmsMessage类型的数组
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];  
        System.out.println(messages.length);
        for (int i = 0; i<myOBJpdus.length; i++) 
        {  
          //使用Object数组当中的对象创建SmsMessage对象
          messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);  
          //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
          System.out.println(messages[i].getDisplayMessageBody());
        }
}


}




十七 . WIFI的操作
1 . 什么是WIFI
WIFI就是一种无线联网的技术 , 和无线路由器一起使用。




2、WIFI网卡有哪些状态
 wifi网卡的状态是由一系列的整形常量来表示的,在Android的官方文档中定义了如下五种状态:




WIFI_STATE_DISABLED   WIFI网卡不可用 
WIFI_STATE_DISABLING  WIFI网卡正在关闭 
WIFI_STATE_ENABLED     WIFI网卡可用 
WIFI_STATE_ENABLING    WIFI网卡正在打开 
WIFI_STATE_UNKNOWN    WIFI网卡状态不可知
这些状态都存在一个名为WifiManager的类当中。


3、如何操作WIFI
    要操作WIFI设备,就需要使用Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理我们的WIFI设备。通过WifiManager对象以下方法来操作:




addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。
calculateSignalLevel(int rssi , int numLevels) 计算信号的等级
compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度
createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接
disableNetwork(int netId) 让一个网络连接失效
disconnect() 断开当前的WIFI连接
enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用
getConfiguredNetworks() 获取网络连接的状态
getConnectionInfo() 获取当前连接的信息
getDhcpInfo() 获取DHCP 的信息
getScanResulats() 获取扫描测试的结果
getWifiState() 获取当前WIFI设备的状态
isWifiEnabled() 判断WIFI设备是否打开
pingSupplicant() ping操作,和PC的ping操作相同作用
ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的
reconnect() 重新连接一个未连接上的WIFI网络
removeNetwork() 移除某一个网络
saveConfiguration() 保留一个配置信息
setWifiEnabled(true)      打开网卡;当参数为fasle时代表设置wifi网卡为关闭状态
startScan() 开始扫描
updateNetwork(WifiConfiguration config) 更新一个网络连接


操作WIFI的时候需要在文件清单中注册WIFI的访问权限。






 
 实例:
public class WifiActivity extends Activity {
    /** Called when the activity is first created. */
private Button startButton = null;  //打开WIFI网卡按钮
private Button stopButton = null;   //关闭wifi网卡按钮
private Button checkButton = null;  //查询wifi网卡按钮
private WifiManager wifiManager = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startButton = (Button)findViewById(R.id.startWifi);
        stopButton = (Button)findViewById(R.id.stopWifi);
        checkButton = (Button)findViewById(R.id.checkWifi);
        startButton.setOnClickListener(new StartWifiListener());
        stopButton.setOnClickListener(new StopWifiListener());
        checkButton.setOnClickListener(new CheckWifiListener());
    }
    class StartWifiListener implements OnClickListener{


@Override
public void onClick(View v) {
wifiManager = (WifiManager)WifiActivity.this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
System.out.println("wifi state --->" + wifiManager.getWifiState());
Toast.makeText(WifiActivity.this, "当前Wifi网卡状态为" + wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
}
    }
    class StopWifiListener implements OnClickListener{


@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
wifiManager = (WifiManager)WifiActivity.this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
System.out.println("wifi state --->" + wifiManager.getWifiState());
Toast.makeText(WifiActivity.this, "当前Wifi网卡状态为" + wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
}
    
    }
    
    class CheckWifiListener implements OnClickListener{


@Override
public void onClick(View v) {
wifiManager = (WifiManager)WifiActivity.this.getSystemService(Context.WIFI_SERVICE);
System.out.println("wifi state --->" + wifiManager.getWifiState());
Toast.makeText(WifiActivity.this, "当前Wifi网卡状态为" + wifiManager.getWifiState(), Toast.LENGTH_SHORT).show();
}
   
    }
}
 


  4、如何得到周围的WIFI热点列表
     如果要想得到周围的WIFI热点列表,可以使用WifiManager.getScanResults()返回一个ScanResult列表,ScanResult对象中,包含了以下几个属性:




BSSID 接入点的地址
SSID 网络的名字,唯一区别WIFI网络的名字
Capabilities 网络接入的性能
Frequency 当前WIFI设备附近热点的频率(MHz)
Level 所发现的WIFI网络信号强度
  5、如何连接上我的WIFI
 /**
  * 根据ID值来自动连接WIFI网络
  * @param index ID值
  */
 public void ConnectWifiBySSID(int index) {
    // 索引大于配置好的网络索引返回
    if (index > mWifiConfiguration.size()) {
     return;
    }
    // 连接配置好的指定ID的网络
    mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);
 }
 /**
  * 根据WifiConfiguration对象来自动连接WIFI网络
  * @param wcg WifiConfiguration对象
  */
 public void ConnectWifiByConfig(WifiConfiguration wifiConfiguration) {
    int wcgID = mWifiManager.addNetwork(wifiConfiguration);
    mWifiManager.enableNetwork(wcgID, true);
 }


  6、如何查看已经连接上的WIFI信息
    在Android的SDK中为我们提供了一个叫做WifiInfo的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。




getBSSID()  获取BSSID属性
getDetailedStateOf()  获取客户端的连通性
getHiddenSSID()  获取SSID 是否被隐藏
getIpAddress()  获取IP 地址
getLinkSpeed()  获取连接的速度
getMacAddress()  获取Mac 地址
getRssi()  获取802.11n 网络的信号
getSSID()  获取SSID
getSupplicanState()  获取具体客户端状态的信息





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值