里面的理解可能有不正确的或不全面的地方,如有疑问可以发邮件给我:
wyj0617mail@aliyun.com
在android上层应用中,有可以监听网络状态的listener功能,这个功能是监听网络的断开与变化事件的,前些日子花了些时间,研究了下这个事件的整体流程,希望通过这个机制的研究,能帮助以后增加其它事件监听。
我们先看下android的网络监听,它是用BroadcastReceiver来接收网络状态改变的广播的,具体实现如下:
首先要定义一个新的BroadcastReceriver类,并且要重写自己的onrecerver()函数,以实现在监听到新的事件后,做什么样的响应
- public class ConnectionChangeReceiver extends BroadcastReceiver {
- private static final String TAG =ConnectionChangeReceiver.class.getSimpleName();
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.e(TAG, "网络状态改变");
- boolean success = false;
- //获得网络连接服务
- ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- // State state = connManager.getActiveNetworkInfo().getState();
- // 获取WIFI网络连接状态
- State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
- // 判断是否正在使用WIFI网络
- if (State.CONNECTED == state) {
- success = true;
- }
- // 获取GPRS网络连接状态
- state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
- // 判断是否正在使用GPRS网络
- if (State.CONNECTED != state) {
- success = true;
- }
- if (!success) {
- Toast.makeText(context, context.getString(R.string.your_network_has_disconnected), Toast.LENGTH_LONG).show();
- }
- }
然后再将新定义的类生成一个对象,并注册到管理系统中(activitymanagerservice):
- mNetworkStateReceiver ConnectionChangeReceiver ;
- IntentFilter filter = new IntentFilter();
- filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
- 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)
1, NULL, NULL, THIS_MODULE);--〉sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)
二,Framework之C++部分