android网络监听事件机制(kernel, c++, java)

本文介绍了一个名为`ConnectionChangeReceiver`的BroadcastReceiver,用于监听Android设备的网络连接变化。当网络状态发生变化时,该接收器会捕获并处理这些事件。通过`ConnectivityManager`服务,它检查了WIFI和GPRS网络的状态来确定当前的网络连接情况,并根据状态显示相应的提示信息。
摘要由CSDN通过智能技术生成
里面的理解可能有不正确的或不全面的地方,如有疑问可以发邮件给我: wyj0617mail@aliyun.com  
在android上层应用中,有可以监听网络状态的listener功能,这个功能是监听网络的断开与变化事件的,前些日子花了些时间,研究了下这个事件的整体流程,希望通过这个机制的研究,能帮助以后增加其它事件监听。
我们先看下android的网络监听,它是用BroadcastReceiver来接收网络状态改变的广播的,具体实现如下:

 首先要定义一个新的BroadcastReceriver类,并且要重写自己的onrecerver()函数,以实现在监听到新的事件后,做什么样的响应
  1. public class ConnectionChangeReceiver extends BroadcastReceiver {  
  2.   
  3.     private static final String TAG =ConnectionChangeReceiver.class.getSimpleName();  
  4.       
  5.     @Override   
  6.     public void onReceive(Context context, Intent intent) {   
  7.     Log.e(TAG, "网络状态改变");   
  8.   
  9.     boolean success = false;   
  10.   
  11.     //获得网络连接服务    
  12.     ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);   
  13.     // State state = connManager.getActiveNetworkInfo().getState();    
  14.     // 获取WIFI网络连接状态   
  15.     State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();   
  16.     // 判断是否正在使用WIFI网络    
  17.     if (State.CONNECTED == state) {  
  18.     success = true;   
  19.     }   
  20.     // 获取GPRS网络连接状态    
  21.     state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();  
  22.     // 判断是否正在使用GPRS网络    
  23.     if (State.CONNECTED != state) {   
  24.     success = true;   
  25.     }   
  26.   
  27.     if (!success) {   
  28.     Toast.makeText(context, context.getString(R.string.your_network_has_disconnected), Toast.LENGTH_LONG).show();   
  29.     }    
  30.     } 
然后再将新定义的类生成一个对象,并注册到管理系统中(activitymanagerservice):
  1. mNetworkStateReceiver   ConnectionChangeReceiver  ;
  2. IntentFilter filter = new IntentFilter();  
  3. filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
  4. registerReceiver(mNetworkStateReceiver, filter); 

以上就算是完整的初始化一个网络监听对象,一旦有新的网络事件(插拨,变化)过来,就是运行onReceive里面的代码。

从android系统中,整个监听机制涉及到kernel, framework, application,下面我将分别从各层次进行分析。
我们的项目T082所使用的平台是samsung C110, android系统为4.0.3版本,kernel为3.0版本。

一, kernel

在kernel中,大部分事件都是由硬件产生中断,通过kobject_uevent_env(kobj, KOBJ_CHANGE, envp);将envp里面的字符串事件发出去,实际上是通过NETLINK类的SOCKET发到上层;
NETLINK的SOCKET的创建过程:kobject_uevent.c:uevent_net_init(struct net *net)--〉Af_netlink.c: netlink_kernel_create(net, NETLINK_KOBJECT_UEVENT,
  1, NULL, NULL, THIS_MODULE);--〉sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)

二,Framework之C++部分
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值