精华内容
下载资源
问答
  • Android项目开发教程编辑锁定讨论上传视频Android项目开发教程书名Android项目开发教程作者车金庆、何征天、李琳、严正宇、周凌翱类别图书>教材>高职高专教材>计算机出版社清华大学出版社出版时间2017年02...

    Android项目开发教程

    编辑

    锁定

    讨论

    上传视频

    Android项目开发教程

    书    名

    Android项目开发教程

    作    者

    车金庆、何征天、李琳、严正宇、周凌翱

    类    别

    图书>教材>高职高专教材>计算机

    出版社

    清华大学出版社出版时间

    2017年02月

    定    价

    ¥35.00

    装    帧

    平装

    ISBN

    9787302455554

    Android项目开发教程内容简介

    编辑

    本书以Android开发环境为核心,以多个业务相对独立但知识彼此关联的项目应用开发和实现为主线,以Android开发环境中各个核心功能的实现为主体内容,以项目实战结合工作任务分解的方式组织内容,完成项目化教学。每个项目应用开发都包括项目分析、算法流程设计、界面设计、代码编写、系统运行与效果测试六个关键环节的内容,将具体的Android项目开发与程序设计工程师的岗位工作过程相融合,让读者在实践中能够从技术和职业两种不同的视角掌握 Android项目开发的全过程。 本书内容的顺序和层次按照Android开发环境的难易程度及Android应用的复杂程度来编排,共分为9章,介绍如何构建Android开发环境、实现通信功能、实现图像与动画功能、网络聊天功能、短信管理功能、影音播放功能、地图GPS功能等项目任务,并在任务实施过程中全程引入平行的项目实践内容,以供学习者参考与实践。 本书适合作为高等职业院校软件技术专业及相关专业师生的教学参考用书,同时也可以作为移动程序开发爱好者及企业移动应用维护人员的指导用书。本书封面贴有清华大学出版社防伪标签,无标签者不得销售。

    Android项目开发教程图书目录

    编辑

    第1章Android概述1

    1.1智能手机操作系统简介1

    1.2Android的基本概念2

    1.2.1Android的发展历程2

    1.2.2Android的平台优势3

    1.4本章小结6

    第2章Android开发环境构建7

    2.1开发环境搭建7

    2.1.1搭建Android环境需要安装的软件7

    2.1.2安装步骤8

    2.1.3Android模拟器运行环境配置10

    2.1.4新的Android开发环境——AndroidStudio15

    2.2创建Android应用程序16

    2.3解析Android应用程序框架20

    2.3.1Android SDK目录详解20

    2.3.2Android程序目录结构详解21

    2.4本章小结24

    第3章通信功能的设计及开发25

    3.1项目分析25

    3.2项目界面设计26

    3.2.1知识准备27

    3.2.2项目界面相关代码设计38

    3.3项目功能的实现41

    3.3.1知识准备41

    3.3.2项目功能相关代码设计49〖2〗〖3〗〖4〗3.4系统运行与效果测试51

    3.5本章小结53

    3.6项目实践54

    第4章水果连连看的设计及开发55

    4.1项目分析55

    4.2连连看算法56

    4.3项目界面设计58

    4.3.1知识准备58

    4.3.2项目界面相关代码设计70

    4.4项目功能的实现77

    4.4.1知识准备78

    4.4.2项目功能相关代码设计84

    4.5系统运行与效果测试92

    4.6本章小结94

    4.7项目实践95

    第5章聊天工具的设计及开发96

    5.1项目分析96

    5.2项目界面设计96

    5.2.1知识准备96

    5.2.2项目界面相关代码设计122

    5.3项目功能的实现127

    5.4系统运行与效果测试133

    5.5本章小结135

    5.6项目实践135

    第6章短信智能管理器的设计及开发136

    6.1项目分析136

    6.2项目界面设计137

    6.2.1知识准备137

    6.2.2项目界面相关代码设计139

    6.3项目功能的实现154

    6.3.1知识准备154

    6.3.2项目功能相关代码设计159

    6.4系统运行与效果测试168

    6.5本章小结170

    6.6项目实践171

    第7章学生信息管理系统的设计及开发172

    7.1项目分析172

    7.2数据库设计: 系统使用mysql数据库173

    7.3项目功能的实现175

    7.3.1知识准备175

    7.3.2Splash界面设计187

    7.3.3系统升级189

    7.3.4安装升级文件192

    7.3.5注册、登录功能193

    7.3.6学生信息管理功能197

    7.4系统运行与效果测试208

    7.5本章小结208

    7.6项目实践208

    第8章影音播放器的设计及开发209

    8.1项目分析209

    8.2项目界面设计210

    8.2.1知识准备210

    8.2.2项目界面相关代码设计212

    8.3项目功能的实现229

    8.3.1知识准备229

    8.3.2项目功能相关代码设计231

    8.4系统运行与效果测试250

    8.5本章小结251

    8.6项目实践251

    第9章基于百度地图的GPS设计及开发252

    9.1项目分析252

    9.2项目界面设计253

    9.2.1知识准备253

    9.2.2项目界面相关代码设计253

    9.3项目功能的实现256

    9.3.1知识准备256

    9.3.2项目功能相关代码设计258

    9.4系统运行与效果测试274

    9.5本章小结274

    9.6项目实践274

    参考文献275[1]

    词条图册

    更多图册

    参考资料

    1.

    Android项目开发教程

    .当当网[引用日期2020-02-16]

    展开全文
  • Android安卓app开发教程网络通信,将几个三方络请求库都用一遍作个比较,附app源代码.zip
  • Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
  • android开发教程

    2012-03-17 23:39:45
    第1章 Android简介及其开发环境的搭建 1.1 Android的诞生 1.2 Android的特点 1.3 Android开发环境的搭建 1.4 第一个Android程序——HelloAndroid 1.5 Android应用程序的调试 1.6 Android应用程序的项目结构 1.7 ...
  • Android WiFi开发教程

    万次阅读 2018-10-11 09:27:12
    Android WiFi开发教程(一)——WiFi热点的创建与关闭   相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网。因此,掌握基本的WiFI开发技术是...

     

    Android WiFi开发教程(一)——WiFi热点的创建与关闭

     

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网。因此,掌握基本的WiFI开发技术是非常必要的。本教程将围绕一个小Demo初步与大家一同探讨WiFi开发。

    先上效果图

    这里写图片描述
    这里写图片描述 
    这里写图片描述

    Demo功能比较简单,四个按钮、两个文本和一个列表。功能主要有创建WiFi热点,关闭WiFi热点,搜索WiFi,连接WiFi,数据通讯。源码会在教程结尾提供。

    本章节主要介绍WiFi热点的创建和关闭

    需要用到的权限

     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>

    WiFi热点的创建

    /**
         * 创建Wifi热点
         */
        private void createWifiHotspot() {
            if (wifiManager.isWifiEnabled()) {
                //如果wifi处于打开状态,则关闭wifi,
                wifiManager.setWifiEnabled(false);
            }
            WifiConfiguration config = new WifiConfiguration();
            config.SSID = WIFI_HOTSPOT_SSID;
            config.preSharedKey = "123456789";
            config.hiddenSSID = true;
            config.allowedAuthAlgorithms
                    .set(WifiConfiguration.AuthAlgorithm.OPEN);//开放系统认证
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
            //通过反射调用设置热点
            try {
                Method method = wifiManager.getClass().getMethod(
                        "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
                boolean enable = (Boolean) method.invoke(wifiManager, config, true);
                if (enable) {
                    textview.setText("热点已开启 SSID:" + WIFI_HOTSPOT_SSID + " password:123456789");
                } else {
                    textview.setText("创建热点失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
                textview.setText("创建热点失败");
            }
        }

    这里我们需要用到一个很重要的API——WifiManager。源码中是有这么一段介绍:

    This class provides the primary API for managing all aspects of Wi-Fi
    connectivity. Get an instance of this class by calling
    {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}.

    可以了解到,我们能够通过WifiManager来管理WiFi的连接。而通过Context.getSystemService(Context.WIFI_SERVICE)就能获取到它的实例。

    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    在开启热点的时候,我们需要确保WiFi是关闭状态,因为大部分手机都是不支持热点和WiFi是同时开启的。接着就需要创建WifiConfiguration这个类,由于配置我们所要创建的热点的属性。这里我们所需注意的主要是SSID、preSharedKey和KeyMgmt。 分别对应热点的名称、密码和加密方式。

    配置完属性后,我们就可以通过Java的反射机制去创建热点。

    WiFi热点的关闭

    /**
         * 关闭WiFi热点
         */
        public void closeWifiHotspot() {
            try {
                Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");
                method.setAccessible(true);
                WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);
                Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
                method2.invoke(wifiManager, config, false);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }

    跟创建WiFI热点一样,关闭的时候同样需要用到Java的反射机制。在调用Method的invoke方法时,将最后一个参数改成false就可以了。

    Android WiFi开发教程(二)——WiFi的搜索和连接

    WiFi的搜索

      /* 搜索wifi热点
         */
        private void search() {
            if (!wifiManager.isWifiEnabled()) {
                //开启wifi
                wifiManager.setWifiEnabled(true);
            }
            wifiManager.startScan();
        }

    我们在开始搜索WiFi之前确保当前WiFi功能是处于开启状态。如果未开启,通过调用WifiManager的setWifiEnabled(boolean enable)去开启。之后调用startScan()就开始扫描附近的WiFi了。而获取扫描的结果我们就需要创建一个广播接收者来处理。

    private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                final String action = intent.getAction();
                if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                    // wifi已成功扫描到可用wifi。
                    List<ScanResult> scanResults = wifiManager.getScanResults();
                    wifiListAdapter.clear();
                    wifiListAdapter.addAll(scanResults);
                } 
        };

    系统在扫描结束后,会发出WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的广播,当我们的接收者接收到这个广播的时候,通过WifiManager的getScanResults()就能获取到扫描结果的集合了。ScanResult保存着每一个WiFi的信息。这里我将这个集合设置到Adapter中,并在列表中展示出来。下面是Apater中主要的代码:

     @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                convertView = mInflater.inflate(mResource, parent, false);
            }
    
            TextView name = (TextView) convertView.findViewById(R.id.wifi_name);
            TextView signl = (TextView) convertView.findViewById(R.id.wifi_signal);
    
            ScanResult scanResult = getItem(position);
            name.setText(scanResult.SSID);
    
            int level = scanResult.level;
            if (level <= 0 && level >= -50) {
                signl.setText("信号很好");
            } else if (level < -50 && level >= -70) {
                signl.setText("信号较好");
            } else if (level < -70 && level >= -80) {
                signl.setText("信号一般");
            } else if (level < -80 && level >= -100) {
                signl.setText("信号较差");
            } else {
                signl.setText("信号很差");
            }
    
            return convertView;
        }

    可以看出列表展示的数据也是比较简单,只有WiFi的名称和信号强度,这两个数据也是平时用得比较多的。获取到扫描结果后,我们就可以处理连接的逻辑了。

    WiFi的连接

    WiFi的连接相当于搜索就要复杂一些。首先给列表项设置点击事件,获取对应的ScanResult。

       listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    wifiManager.disconnect();
                    final ScanResult scanResult = wifiListAdapter.getItem(position);
                     String capabilities = scanResult.capabilities;
                    int type = WIFICIPHER_WPA;
                    if (!TextUtils.isEmpty(capabilities)) {
                        if (capabilities.contains("WPA") || capabilities.contains("wpa")) {
                            type = WIFICIPHER_WPA;
                        } else if (capabilities.contains("WEP") || capabilities.contains("wep")) {
                            type = WIFICIPHER_WEP;
                        } else {
                            type = WIFICIPHER_NOPASS;
                        }
                    }
                    config = isExsits(scanResult.SSID);
            });

    取到ScanResult后我们通过他的capabilities属性判断WiFi的加密方式。接着通过isExsits(String SSID)方法判断系统是否保存着当前WiFi的信息。

    private WifiConfiguration isExsits(String SSID) {
            List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
            for (WifiConfiguration existingConfig : existingConfigs) {
                if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
                    return existingConfig;
                }
            }
            return null;
        }

    如果之前连接过,则返回WiFi的配置信息,否则返回空对象。然后接着处理连接的逻辑

    if (config == null) {
                        if (type != WIFICIPHER_NOPASS) {//需要密码
                            final EditText editText = new EditText(MainActivity.this);
                            final int finalType = type;
                            new AlertDialog.Builder(MainActivity.this).setTitle("请输入Wifi密码").setIcon(
                                    android.R.drawable.ic_dialog_info).setView(
                                    editText).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Log.w("AAA", "editText.getText():" + editText.getText());
                                    config = createWifiInfo(scanResult.SSID, editText.getText().toString(), finalType);
                                    connect(config);
                                }
                            })
                                    .setNegativeButton("取消", null).show();
                            return;
                        } else {
                            config = createWifiInfo(scanResult.SSID, "", type);
                            connect(config);
                        }
                    } else {
                        connect(config);
                    }

    当没有获取到所要连接WiFi的配置信息时,我们就需要用到前面获取到的加密方式判断是否需要输入密码。如果加密方式为WAP或WEP时,则弹出提示框提示用户输入WiFi密码。用户输入密码后再调用connect(WifiConfiguration config)方法

    如果可以获取到所要连接WiFi的配置信息,则直接调用connect(WifiConfiguration config)。

    private void connect(WifiConfiguration config) {
            int wcgID = wifiManager.addNetwork(config);
            wifiManager.enableNetwork(wcgID, true);
        }

    直接调用WifiManger的addNetwork方法,将配置信息传进去后,会创建一个新的网络描述的身份并返回回来,如果返回来是-1,则表示创建失败。获取到身份后,调用enableNetwork方法就能开始连接WiFi了。到了这里,我们连接部分就完成了一半,接下来需要继续处理WiFi连接过程中返回来的状态。这里同样我们是需要用到广播接收者来处理。

    if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
    
                    if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {
                        text_state.setText("连接已断开");
                    } else if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
                        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                        final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                        text_state.setText("已连接到网络:" + wifiInfo.getSSID());
    
                        }
                    } else {
                        NetworkInfo.DetailedState state = info.getDetailedState();
                        if (state == state.CONNECTING) {
                            text_state.setText("连接中...");
                        } else if (state == state.AUTHENTICATING) {
                            text_state.setText("正在验证身份信息...");
                        } else if (state == state.OBTAINING_IPADDR) {
                            text_state.setText("正在获取IP地址...");
                        } else if (state == state.FAILED) {
                            text_state.setText("连接失败");
                        }
                    }
    
                }

    上面是广播接收者中的关键代码。WiFi在连接的过程中系统会发出WifiManager.NETWORK_STATE_CHANGED_ACTION的广播,当接收者接收到这条广播时,获取NetworkInfo的state来判断当前的连接状态。状态值分别代表如下

    NetworkInfo.State.DISCONNECTED //连接已断开
    NetworkInfo.State.CONNECTED //已成功连接
    

    除了这两个状态之外,这里还判断了其他状态

    NetworkInfo.DetailedState state = info.getDetailedState();
                        if (state == state.CONNECTING) {
                            text_state.setText("连接中...");
                        } else if (state == state.AUTHENTICATING) {
                            text_state.setText("正在验证身份信息...");
                        } else if (state == state.OBTAINING_IPADDR) {
                            text_state.setText("正在获取IP地址...");
                        } else if (state == state.FAILED) {
                            text_state.setText("连接失败");
                        }

    DetailedState中包含了很多连接状态的信息,这里只对部分状态进行处理,其他状态值解析具体如下

    IDLE:空闲
    SCANNING:正在扫描
    CONNECTING:连接中
    AUTHENTICATING:正在进行身份验证
    OBTAINING_IPADDR:正在获取Ip地址
    CONNECTED:已连接
    SUSPENDED:已暂停
    DISCONNECTING:正在断开连接
    DISCONNECTED:已断开
    FAILED:失败
    BLOCKED:已阻止
    VERIFYING_POOR_LINK:暂时关闭(网络状况不佳)
    CAPTIVE_PORTAL_CHECK:判断是否需要浏览器二次登录

     

    跟蓝牙通讯一样,WiFi热点数据传输也是要运用到Socket。这里我创建了两个线程ConnectThread和ListenerThread,分别去处理数据传输和监听连接。

    ConnectThread

    **
     * 连接线程
     * Created by 坤 on 2016/9/7.
     */
    public class ConnectThread extends Thread{
    
        private final Socket socket;
        private Handler handler;
        private InputStream inputStream;
        private OutputStream outputStream;
    
        public ConnectThread(Socket socket, Handler handler){
            setName("ConnectThread");
            this.socket = socket;
            this.handler = handler;
        }
    
        @Override
        public void run() {
            if(socket==null){
                return;
            }
            handler.sendEmptyMessage(MainActivity.DEVICE_CONNECTED);
            try {
                //获取数据流
                inputStream = socket.getInputStream();
                outputStream = socket.getOutputStream();
    
                byte[] buffer = new byte[1024];
                int bytes;
                while (true){
                    //读取数据
                    bytes = inputStream.read(buffer);
                    if (bytes > 0) {
                        final byte[] data = new byte[bytes];
                        System.arraycopy(buffer, 0, data, 0, bytes);
    
                        Message message = Message.obtain();
                        message.what = MainActivity.GET_MSG;
                        Bundle bundle = new Bundle();
                        bundle.putString("MSG",new String(data));
                        message.setData(bundle);
                        handler.sendMessage(message);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 发送数据
         */
        public void sendData(String msg){
            if(outputStream!=null){
                try {
                    outputStream.write(msg.getBytes());
                    Message message = Message.obtain();
                    message.what = MainActivity.SEND_MSG_SUCCSEE;
                    Bundle bundle = new Bundle();
                    bundle.putString("MSG",new String(msg));
                    message.setData(bundle);
                    handler.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                    Message message = Message.obtain();
                    message.what = MainActivity.SEND_MSG_ERROR;
                    Bundle bundle = new Bundle();
                    bundle.putString("MSG",new String(msg));
                    message.setData(bundle);
                    handler.sendMessage(message);
                }
            }
        }
    }

    ConnectThread的构造中,传入了Socket和Handler。Socket用来获取数据以及发送数据,Handler用来更新UI了。在run方法中,我们从Socket中获取到了输入流和输出流,然后循环地读取InputStream的数据,当读取到数据时,则通过Handler将数据更新到UI上。在sendData方法中主要是通过OutputStream写入数据,然后将写入结果通过Handler更新到UI上。

    ListenerThread监听线程处理的逻辑就比较简单,通过端口号获取ServerSocket后调用accept()阻塞线程,直到有设备连接上后就通过Handler更新UI。这里需要注意的是连接上的设备的端口号必须与这里的端口号相同。接着我们看看Hander获取到消息后做了哪些处理。

    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case DEVICE_CONNECTING:
                        connectThread = new ConnectThread(listenerThread.getSocket(),handler);
                        connectThread.start();
                        break;
                        ... ...
                }
            }
        };

    可以看到Handler获取到数据后,通过listenerThread.getSocket()将获取到Socket和handler一同创建了ConnectThread实例。

    接下来就是用这两个线程来处理数据传输了。

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ... ...
            listenerThread = new ListenerThread(PORT, handler);
            listenerThread.start();
        }

    在onCreate中我们创建ListenerThread并启动它,让它监听是否有设备连接上来。当然这里需要先开启WiFi热点后才会有设备连接上来。这是开启热点并等待设备连接的情况。当然我们也可以主动去连接其他开启着热点的设备。

    在监听WiFi连接情况的广播接收者中加入下面的代码

    if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
                        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                        final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                        text_state.setText("已连接到网络:" + wifiInfo.getSSID());
    
                        if (wifiInfo.getSSID().equals(WIFI_HOTSPOT_SSID)) {
                            //如果当前连接到的wifi是热点,则开启连接线程
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    try {
                                        ArrayList<String> connectedIP = getConnectedIP();
                                        for (String ip : connectedIP) {
                                            if (ip.contains(".")) {
    
                                                Socket socket = new Socket(ip, PORT);
                                                connectThread = new ConnectThread(socket, handler);
                                                connectThread.start();
                                            }
                                        }
    
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }).start();
                        }
                    } else {
                        ...
                        }
                }

    这里本地固定了其他设备WiFi热点的SSID,如果当前连接的WiFi的SSID跟我们之前保存的SSID一致,则证明我们连上了我们需要的WiFi热点。然后通过getConnectedIP()获取WiFi热点的IP地址,通过这个IP地址和端口号创建一个Socket,然后创建ConnectThread来处理数据传输。到这里我们可以看到,PORT和SSID这两个数据是需要两个设备事先协议好的。

    最后再看看Handler完整的代码

    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case DEVICE_CONNECTING:
                        connectThread = new ConnectThread(listenerThread.getSocket(),handler);
                        connectThread.start();
                        break;
                    case DEVICE_CONNECTED:
                        textview.setText("设备连接成功");
                        break;
                    case SEND_MSG_SUCCSEE:
                        textview.setText("发送消息成功:" + msg.getData().getString("MSG"));
                        break;
                    case SEND_MSG_ERROR:
                        textview.setText("发送消息失败:" + msg.getData().getString("MSG"));
                        break;
                    case GET_MSG:
                        textview.setText("收到消息:" + msg.getData().getString("MSG"));
                        break;
                }
            }
        };

    至此,WiFi热点数据传输也就介绍完了。如果有什么疑问,欢迎和本人一起探讨。

    最后附上源码地址

    CSDN 原文:https://blog.csdn.net/a1533588867/article/details/52460636?utm_source=copy 

    展开全文
  • 安卓开发教程(Android多界面应用程序开发)开篇本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分。建议精读,深刻理解大意。多做实践。多写代码。本文章由做全栈攻城狮原创首发。同名公众号已开启,官网...

    安卓开发教程(Android多界面应用程序开发)

    开篇

    本文阅读需10分钟,简单易上手,属于安卓开发教程的基础部分。

    建议精读,深刻理解大意。多做实践。多写代码。

    本文章由做全栈攻城狮原创首发。

    同名公众号已开启,官网www.8z5.net。

    本套教程主要讲解安卓开发的相关知识,从基础到精通。一方面可以巩固自己所得,另一方面可以帮助对安卓开发感兴趣的朋友。

    上几次主要讲解的是网络请求的相关知识。在接下来一段时间,将要讲解Activity多界面应用程序的开发。

    Activity

    Activity是安卓四大组件之一。安卓四大组件分别为:Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收者。我们会按照这个顺序进行讲解。

    今天是Activity。何为Activity?

    个人理解就是在App中的每一个界面都属于Activity。在这个界面上实现功能,处理逻辑。

    可以看到在安卓的项目中有Activity的身影:

    2d77e066c3ff591ca6189984462ca5a0.png

    安卓项目

    Activity需要进行配置才可以使用。

    Activity需要在AndroidManifest.xml中进行配置才可以使用。

    那你可能会问,为什么我们以前写的项目,为什么Acti百思特网vity可以直接打开呢?

    那是因为在默认创建Activity时,已经自动在Androidmanifest.xml中配置百思特网了。如图:

    07ac54ba91876659d31de706890fa138.png

    Activity中的配置

    解读一下这个配置:

    b860409130efdfb3c511be18bdecac47.png

    Activity在Androidmanifest中的配置

    Name:表示Activity类所在的包名+类名,我们把它叫做完全路径。

    Action标签的Name为MAIN表示这个Activity是程序的主入口。运行本程序直接进入这个Activity。

    category中的name为LAUNCHER表示本activity可以在Launcher中执行。launcher可以理解为桌面。

    下面新建一个SecondActivity并配置:

    新建:

    96480ccaad259c8f697b3ad21fd7f14c.png

    新建Activity

    添加完毕你会发现Androidmanifest中自动添加对应的配置,这就是最简单的Activity。

    780405d0e8926fb927f477c3eae192da.png

    Activity的配置

    用MainActivity启动SecondActivity:

    为了区分两个Activity,分别更改其中的界面:

    90992c28b5fbf04e23b865eaf4c650d4.png

    MainActivity

    5407a552236869dd1f4921f7d309c341.png

    SecondActivity

    在MainActivity中添加按钮,跳转到SecondActivity:

    f6e2b9dd447cdcc4e1cb5c38b0fe3d31.png

    Intent意图跳转

    此时点击MainActivity中的按钮即可进入SecondActivity。

    跳转并带数据过去

    跳转Activity的时候,加入键值对数据:

    8d57eaa5df287ab62c6577cec6d61617.png

    传递数据在百思特网Intent

    在SecondActivity中获取数据:

    添加textView显示data的值:

    caa227fabbeb0edd9ff1b1b1c05cd62c.png

    Second的前台界面

    获取MainActivity传递过来的值:

    15d5c1111e331d97d4de741cc9b53866.png

    获取传递过来的data值

    效果:

    9fdd9b8aedd605e5fe7382c0b212680f.png

    传输数据的效果

    当然可以附带更多数据,直接在下面继续put就可以了,下面进行传递一个图片数据:

    9f4c664d260035e4e86cdc4eab0ca950.png

    两者之间的大体传递形式

    本文地址:https://m.best73.com/news/106785.html

    展开全文
  • 分享一部比较好的教程,从环境搭建开始,教程内容有实用性,有兴趣的同学可以拿去更新下技能包,附上图片 下载地址:安卓数据存储开发网络通讯开发完整教程

    分享一部比较好的教程,从环境搭建开始,教程内容有实用性,有兴趣的同学可以拿去更新下技能包,附上图片
    在这里插入图片描述
    下载地址:安卓数据存储开发网络通讯开发完整教程

    展开全文
  • 1、 WIFI网卡的状态WIFI网卡的状态信息都以整型变量的形式存放在 android.net.wifi.WifiManager 类中,有以下状态:WIFI_STATE_DISABLEDWIFI网卡不可用WIFI_STATE_DISABLINGWIFI网卡正在关闭WIFI_STATE_ENABLEDWIFI...
  • Android开发教程

    2011-06-25 17:56:18
    本书内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android...
  • Android 安卓开发入门教程

    千次阅读 2016-07-07 11:03:24
    梦想绘图控件开发教程 V6.0版 1 1、 环境搭建: 3 1.1、 下载Android SDK 3 1.2、 下载 eclipse 5 1.3、 下载JDK6 5 1.4、 为Eclipse安装ATD插件 8 1.5、 运行Eclipse设置Android ADT插件 10 1.6、 NDK安装 ...
  • android网络开发原理

    2011-04-28 10:29:30
    Android网络开发原理教程,对于Android网络应用开发童鞋很有帮助
  • 前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。 简介 WebView是一个基于webkit引擎、展现web页面的控件。 Android的Webview在低版本...混合开发相关博客: Android
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商...
  • 注:本教程不讨论如何安装android开发环境。开发平台:Mac开发工具:Android Studio版本控制:Git代码托管:GitHub下面是新建项目的流程:稍等一会,就会看到下图:创建虚拟设备:运行:结果:添加webview:用到的三...
  • android开发教程4.0.

    2012-03-17 23:38:50
    第1章 Android简介及其开发环境的搭建 1.1 Android的诞生 1.2 Android的特点 1.3 Android开发环境的搭建 1.4 第一个Android程序——HelloAndroid 1.5 Android应用程序的调试 1.6 Android应用程序的项目结构 1.7 ...
  • Android教程-全套完整教程112G 实际大小:112GB 链接:http://pan.baidu.com/s/1DX1kU 赠送JAVA视频教程 压缩大小:4.55GB 实际大小:7.83GB 下载地址:...
  • 第 10 章 Android 网络应用;public void getDatasync){ new Thread(new Runnable) { @Override public void run) { try { OkHttpClient client = new OkHttpClient; //创建OkHttpClient对象 Request request = new ...
  • [14本经典Android开发教程]-4-Android应用程序开发36技 本书共分为4篇: ※ 第一篇:介绍应用框架概念、原理和特性。 ※ 第二篇:阐述应用框架之设计技巧。亦即,如何打造应用框架。 (注:如果你的职务是「使用」...
  • Android开发教程JAVA基础(汇总)

    千次阅读 2013-09-21 18:28:26
    Android游戏开发视频教程(汇总) Android开发教程JAVA基础之Java 概述 Android开发教程JAVA基础之标示符、关键字1 ...Android开发教程JAVA基础之标示符、关键字2 ...Android开发教程JAVA基础之流程
  • Android APP 快速开发教程安卓) 前言 本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节,从整个大局去把握如何去构思...
  • android开发视频教程

    2018-11-30 12:54:35
    android开发视频教程,多套项目实战包括多媒体视频播放仿抖音APP,京东商城,千牛云视频直播,互联网新闻客户端 Androidstudio开发工具 Android-Studio开发工具入门 11Android项目 10、知识点精讲 09、Android ...
  • 这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 ...
  • 开发应用一个关键的步骤是调试,对于NDK的C代码调试有很多种方法, ...使用NDK-GDB,NDK-GDB的命令行调试方法和GDB类似,网络有很多关于GDB的教程 使用Eclipse+CDT+GDB调试android NDK程序 实时调试,不过这种方
  • 本文主要介绍Android的Handler的使用方法。Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列
  • 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程Android设计规范,免费的设计素材等。
  • 这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 ...
  • 花了一个晚上,把网络上的《新版Android开发教程》整理了一下。 1、删除了极端难看的所有页面的背景,使浏览速度大大提高; 2、更正了listview使用数组的例子的错误设置; 3、将所有PDF合并为一个,重新整理了目录。
  • 对于不管从事任何行业 使用任何编程语言的人们来说 当接触一个新知识 或者新出现的一个新平台来说 了解其基础知识非常重要 这在这里我指针对与android游戏开发的人来说 刚接触它的时候不了解android系统的架构 ...
  • 4向Internet传送xml数据XML格式是网络通信的标准语言Android系统也支持通过传送XML文件传输数据使用HTML的方式传输文件一般文件大小在5M以下传输大文件不适合HTML通信方式对大文件的传输最好使用Socket通信方式保证...
  • Android 网络教程: 开始

    千次阅读 2017-08-04 15:38:03
    从 API 级别 1 开始,网络始终是 Android 中最大主角。大部分 app 都不是单独运行的,它们会连接到网络服务检索数据或者进行其他网络操作。在本教程中,你会创建一个简单 app ,连接 GitHub API 查找并显示代码库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,397
精华内容 15,758
关键字:

安卓网络开发教程