WifiSettings源码分析一

wifi的入口Activity:WifiSettings.java进入wifi界面首先显示的是wifi关闭的页面(wifi默认关闭) 接着打开开关,开始扫面附近可用热点搜索到热点就以列表的形式显示出来,我们可对可用的wifi进行连接、保存、添加、删除等操作。那么这一系列的动作在代码中是如何体现出来的呢?看代码分析,。1、onCreate()@Overridepublic void onCre
摘要由CSDN通过智能技术生成

wifi的入口Activity:WifiSettings.java

进入wifi界面首先显示的是wifi关闭的页面(wifi默认关闭)
这里写图片描述
接着打开开关,开始扫面附近可用热点

这里写图片描述

搜索到热点就以列表的形式显示出来,我们可对可用的wifi进行连接、保存、添加、删除等操作。

那么这一系列的动作在代码中是如何体现出来的呢?看代码分析,。

1、onCreate()

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    //设置布局文件
    addPreferencesFromResource(R.xml.wifi_settings);
    mUserBadgeCache = new UserBadgeCache(getPackageManager());

    //启动线程
    mBgThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
    mBgThread.start();
}

2、onActivityCreated()

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //创建wifitracker对象,设置扫描到wifi后系统发送的广播的action
    mWifiTracker =
            new WifiTracker(getActivity(), this, mBgThread.getLooper(), true, true, false);
    //获取wifi管理器,管理wifi的开启、关闭、扫描、建立连接、配置等信息
    mWifiManager = mWifiTracker.getManager();
    //wifi连接监听
    mConnectListener = new WifiManager.ActionListener() {
                               @Override
                               public void onSuccess() {
                               }
                               @Override
                               public void onFailure(int reason) {
                                   Activity activity = getActivity();
                                   if (activity != null) {
                                       Toast.makeText(activity,
                                            R.string.wifi_failed_connect_message,
                                            Toast.LENGTH_SHORT).show();
                                   }
                               }
                           };
    //wifi保存监听(右上角menu:Saved Networks)
    mSaveListener = new WifiManager.ActionListener() {
                            @Override
                            public void onSuccess() {
                            }
                            @Override
                            public void onFailure(int reason) {
                                Activity activity = getActivity();
                                if (activity != null) {
                                    Toast.makeText(activity,
                                        R.string.wifi_failed_save_message,
                                        Toast.LENGTH_SHORT).show();
                                }
                            }
                        };
    //忘记网络监听
    mForgetListener = new WifiManager.ActionListener() {
                               @Override
                               public void onSuccess() {
                               }
                               @Override
                               public void onFailure(int reason) {
                                   Activity activity = getActivity();
                                   if (activity != null) {
                                       Toast.makeText(activity,
                                           R.string.wifi_failed_forget_message,
                                           Toast.LENGTH_SHORT).show();
                                   }
                               }
                           };

    if (savedInstanceState != null) {
        mDlgEdit = savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
        mDlgModify = savedInstanceState.getBoolean(SAVE_DIALOG_MODIFY_MODE);
        if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
            mAccessPointSavedState =
                savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
        }

        if (savedInstanceState.containsKey(SAVED_WIFI_NFC_DIALOG_STATE)) {
            mWifiNfcDialogSavedState =
                savedInstanceState.getBundle(SAVED_WIFI_NFC_DIALOG_STATE);
        }
    }

    // if we're supposed to enable/disable the Next button based on our current connection
    // state, start it off in the right state
    Intent intent = getActivity().getIntent();
    mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);

    if (mEnableNextOnConnection) {
        if (hasNextButton()) {
            final ConnectivityManager connectivity = (ConnectivityManager)
                    getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (connectivity != null) {
                NetworkInfo info = connectivity.getNetworkInfo(
                        ConnectivityManager.TYPE_WIFI);
                changeNextButtonState(info.isConnected());
            }
        }
    }

    //初始化空的视图
    mEmptyView = initEmptyView();
    //注册上下文菜单(相当于ListView的长按事件)
    registerForContextMenu(getListView());
    //在Fragment中给action bar添加action在onCreate()中调用 setHasOptionsMenu(true)。Android Framework会调用Fragement中的onCreateOptionsMenu()来向Activity的Menu中添加item。
    setHasOptionsMenu(true);

    if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
        mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
        onAccessPointsChanged();
    }
}

在OnActivityCreate()函数中首先是创建了WifiTracker对象,经过分析发现这个类是负责启动wifi扫描附近可用热点的类,在启动扫描前进行了广播动作的设置。但还木有真正的注册广播接收者。

@VisibleForTesting
WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper,
        boolean includeSaved, boolean includeScans, boolean includePasspoints,
        WifiManager wifiManager, Looper currentLooper) {
    if (!includeSaved && !includeScans) {
        throw new IllegalArgumentException("Must include either saved or scans");
    }
    mContext = context;
    if (currentLooper == null) {
        // When we aren't on a looper thread, default to the main.
        currentLooper = Looper.getMainLooper();
    }
    mMainHandler = new MainHandler(currentLooper);
    mWorkHandler = new WorkHandler(
            workerLooper
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值