第一行代码 android_第一行代码 android 第1版 - CSDN
  • 第一行代码Android学习:第十一部分主要涉及到WebView、Http协议访问网络、解析JSON格式数据、LocationManager的基本用法

    第一行代码Android学习:第十一部分主要涉及到WebView、Http协议访问网络、解析JSON格式数据、LocationManager的基本用法
    1.DYHDM_10_00NetworkTest

    • AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />
    • activity_main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <WebView
            android:id="@+id/wv"
            android:visibility="gone"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/hello_world" />
    
        <Button
            android:id="@+id/bt_send_request"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Send Request" />
    
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
            <TextView
                android:id="@+id/tv_response"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </ScrollView>
    
    </LinearLayout>
    • MainActivity.java
    package com.example.dyhdm_10_00networktest;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.lang.reflect.Type;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONArray;
    import org.json.JSONObject;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.webkit.WebView;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity implements OnClickListener {
    
        private WebView webView;
        public static final int SHOW_RESPONSE = 0;
        private Button sendResquest;
        private TextView responseText;
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case SHOW_RESPONSE:
                    String response = (String) msg.obj;
                    responseText.setText(response);
                    // parseJSONWithJSONObject(response);
                    parseJSONWithGSON(response);
                    break;
    
                default:
                    break;
                }
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            /*
             * webView = (WebView) findViewById(R.id.wv); // 让WebView支持JavaScript脚本
             * webView.getSettings().setJavaScriptEnabled(true);
             * webView.setWebViewClient(new WebViewClient() { //
             * 当需要从一个网页跳到另一个网页,目标网页仍在当前WebView中打开
             * 
             * @Override public boolean shouldOverrideUrlLoading(WebView view,
             * String url) { view.loadUrl(url); return true;//
             * 当前WebView可以处理打开新网页的请求,不借助系统浏览器 } });
             * webView.loadUrl("http://www.baidu.com");
             */
            sendResquest = (Button) findViewById(R.id.bt_send_request);
            responseText = (TextView) findViewById(R.id.tv_response);
            sendResquest.setOnClickListener(this);
        }
    
        /**
         * TODO 解析JSON数据,用GSON
         * 
         * @throw
         * @return void
         */
        protected void parseJSONWithGSON(String response) {
            Gson gson = new Gson();
            List<Map<String, String>> lists = gson.fromJson(response,
                    new TypeToken<List<Map<String, String>>>() {
                    }.getType());
            for (Map<String, String> map : lists) {
                Log.i("zza", map.get("zw"));
            }
        }
    
        /**
         * TODO 解析JSON数据,用JSONObject
         * 
         * @throw
         * @return void
         */
        protected void parseJSONWithJSONObject(String response) {
            try {
                JSONArray jsonArray = new JSONArray(response);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    Log.i("zza", jsonObject.get("patientId").toString());
                    Log.i("zza", jsonObject.get("zw").toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 重载方法
         */
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.bt_send_request) {
                // sendRequestWithHttpURLConnection();
                sendRequestWithHttpClient();
            }
        }
    
        /**
         * TODO 使用HttpClient开启线程发送网络请求
         * 
         * @throw
         * @return void
         */
        private void sendRequestWithHttpClient() {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        HttpClient httpClient = new DefaultHttpClient();
                        // 发送GET请求
                        // HttpGet httpGet = new HttpGet("http://www.baidu.com");
                        // 发送POST请求
                        HttpPost httpPost = new HttpPost(
                                "http://192.168.1.112:9000/newapk.Prescription/getPrescription");
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("patientId", "666666"));
                        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(
                                params, "UTF-8");
                        httpPost.setEntity(entity);
                        // HttpResponse httpResponse = httpClient.execute(httpGet);
                        HttpResponse httpResponse = httpClient.execute(httpPost);
                        if (httpResponse.getStatusLine().getStatusCode() == 200) {
                            // 请求和响应都成功了
                            HttpEntity entity1 = httpResponse.getEntity();
                            String response = EntityUtils
                                    .toString(entity1, "UTF-8");
    
                            Message message = new Message();
                            message.what = SHOW_RESPONSE;
                            // 将服务器返回的结果存放在Message中
                            message.obj = response.toString();
                            handler.sendMessage(message);
                        }
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * TODO 使用HttpURLConnection开启线程发送网络请求
         * 
         * @throw
         * @return void
         */
        private void sendRequestWithHttpURLConnection() {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    HttpURLConnection conn = null;
                    try {
                        URL url = new URL("http://www.baidu.com");
                        conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(8000);
                        conn.setReadTimeout(8000);
                        /*
                         * 提交数据给服务器 conn.setRequestMethod("POST"); DataOutputStream
                         * out = new DataOutputStream(conn.getOutputStream());
                         * out.writeBytes("username=admin&password=123455");
                         */
                        InputStream in = conn.getInputStream();
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(in));
                        StringBuilder response = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                        }
                        Message message = new Message();
                        message.what = SHOW_RESPONSE;
                        message.obj = response.toString();
                        handler.sendMessage(message);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (conn != null) {
                            conn.disconnect();
                        }
                    }
    
                }
            }).start();
        }
    
    }
    

    2.DYHDM_11_00LocationTest

    • AndroidManifest.xml
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    • activity_main.xml
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <TextView
            android:id="@+id/position_test_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="@string/hello_world" />
    
    </RelativeLayout>
    • MainActivity.java
    package com.example.dyhdm_11_00locationtest;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private TextView postionTextView;
        private LocationManager locationManager;
        private String provider;
        LocationListener locationListener = new LocationListener() {
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
    
            @Override
            public void onProviderEnabled(String provider) {
            }
    
            @Override
            public void onProviderDisabled(String provider) {
            }
    
            @Override
            public void onLocationChanged(Location location) {
                showLocation(location);
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            postionTextView = (TextView) findViewById(R.id.position_test_view);
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            // 获取所有可用的位置提供器
            List<String> providderList = locationManager.getProviders(true);
            if (providderList.contains(LocationManager.GPS_PROVIDER)) {
                provider = LocationManager.GPS_PROVIDER;
            } else if (providderList.contains(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
            } else {
                // 当没有可用的位置提供器时,弹出Toast提示用户
                Toast.makeText(this, "No location provider to use",
                        Toast.LENGTH_SHORT).show();
                return;
            }
    
            Location location = locationManager.getLastKnownLocation(provider);
            if (location != null) {
                showLocation(location);
            }
            // 四个参数
            // 第一个:位置提供器的类型
            // 第二个:监听位置变化的事件间隔
            // 第三个:移动距离
            // 第四个:监听器
            locationManager.requestLocationUpdates(provider, 5000, 1,
                    locationListener);
        }
    
        /**
         * TODO 显示当前位置
         * 
         * @throw
         * @return void
         */
        private void showLocation(Location location) {
            String currentPosition = "latitude is " + location.getLatitude() + "\n"
                    + "longitude is " + location.getLongitude();
            postionTextView.setText(currentPosition);
        }
    
        /**
         * 重载方法
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (locationManager != null) {
                // 关闭程序时将监听器移除
                locationManager.removeUpdates(locationListener);
            }
        }
    }
    

    代码下载地址

    展开全文
  • 其实我当初决定开始写博客的想法挺简单的,觉得自己搞技术这么多年...更令我没想到的事,在我开始写博客不久之后,人民邮电出版社图灵公司的副总编辑陈冰老师就联系上了我,希望我可以写本关于Android开发技术的书籍

    书中源码下载地址:http://download.csdn.net/detail/sinyu890807/7747691


    前言


    其实我当初决定开始写博客的想法挺简单的,觉得自己搞技术这么多年了,总应该要留下点什么。既然没能写出什么出色的应用,那至少也要留下点文字分享给大家,以指引在我后面的开发者们,毕竟我也从前辈们的博客那里受惠了很多。


    受邀


    下定决心之后我就开始了我的博客之旅,令我没想到的是,我写的文章竟然非常受大家的欢迎,短时间内就聚集了大量的人气。更令我没想到的事,在我开始写博客不久之后,人民邮电出版社图灵公司的副总编辑陈冰老师就联系上了我,希望我可以写一本关于Android开发技术的书籍!


    陈冰,第一次听到这个名字的时候相信大家和我一样都不会感到熟悉,但是当他告诉我,他之前一手策划过《大话设计模式》这本书时,我立刻冲向了我的书柜并找到它,翻开扉页后赫然就在责任编辑那一栏看到了陈冰的名字,往后翻还可以看到他为《大话设计模式》写的序。这时我的心里只有一个念头,他邀请我写的这本书我是无论如何都拒绝不了了!


    创作


    接下来我就开始构思如何去完成这本书了。创作的过程注定是艰辛的,虽然我已经有了一些写博客的经验,但写书着实还是头一回,而写书又和写博客有着很大的差距。博客的内容可以比较散乱,想到哪里写到哪里,但书的内容一定要系统化,讲究循序渐进,基本上在写第1章的时候就应该把全书的内容都确定下来了。


    正所谓万事开头难,因此我首先是花了大约两个星期的时间制定了这本书的目录,这也就成为了我后面的写作大纲。陈冰告诉我,如果可以把目录制定出来,那么基本上就已经完成80%的工作了,然而事实证明,即使制定出了目录,事情也远远没有想象中的那么简单。我毕竟无法全身心地投入到写书当中,因为每天还要上班工作,有时还要加班,我只能在下班了之后再开始整理自己的思绪,然后动笔。另外,我之前对写书这件事算是严格保密的,并没有在博客上进行过任何透漏,因此我无法因为这个原因而停止更新博客,仍然坚持着每周或两周一篇的节奏。


    就这样在工作、博客和写书之间制衡着,虽然很辛苦,但我并没有落下任何一项。工作依旧相当出色,博客的质量大家有目共睹,而书怎么样大家拿到手之后就知道了。我创作的那段时间大概是保持着每月两章的进度,包括春节假期的那段时间也写个不停,最终在今年的3月份完全终稿,刚好赶上了截稿日期。到这里我的工作就已经基本完成了,后面的任务开始由出版社接手,他们审核、校对、排版、设计封面、印刷,终于在7月份的下旬开始预售了,一年的辛苦即将可以看到成果,我也表示非常期待。


    比较


    叙述完了创作的过程,接下来我们还是看一看这本书吧。这本书叫作《第一行代码——Android》,从名字上就可以看出来,这是一本非常适合初学者的书籍,我特别想写这样的一本书,因为它可以和我的博客相辅相成。由于我写博客的时间比较晚,13年才开始写的,当时很多Android技术相关的内容都已经被人写过了,重复再写一遍别人写过的东西显然太没创意,因此我给自己的博客定了一个主题,那就是只写比较高级的应用技术。可是博客的主题虽然非常鲜明,却明显不太适合初学者的朋友们阅读,从众多的评论当中我也能看出,有不少朋友的基本功还是不够扎实的,如果能结合一本介绍基础的书来巩固基本功,那你就真的变得无懈可击了,因此《第一行代码——Android》应运而生。


    下面我来对博客和书中的内容做个简要的对比吧,让大家心里有个数。

    • 博客更加倾向于介绍Android高级技巧,而书中则是基础、进阶、实用技巧都有。
    • 阅读博客时你需要有相当不错的Android基础,而阅读书时你不需要有任何的Android基础。
    • 博客中的内容相对比较散乱,而书中的内容更加系统化、科学化(这个是必然现象,一个是想到哪儿写到哪儿,一个是精心策划出来的)。
    • 出于对读者的尊重,我不会简单地将博客里的内容复制到书里,而出于对版权的保护,我也不会把书里的内容在博客上发表。因此,书和博客的内容基本不会有交集,这样买书的朋友们不会有种买了本纸质版博客的感觉。


    特色


    当然了,这本书还是有很多独有特色的,不然的话就和市场上的其它书没什么区别了。你不需要有任何Android基础就可以阅读它,但它会带领你一步步深入了解Android的各项功能。其中有不少章节我认为是非常出彩的,比如说第二章对Activity启动模式的讲解非常细致,市场上多数同类书中都没有这部分内容的,第七章对ContentProvider的讲解也相当到位,相信可以满足不少朋友的求知欲望。再比如说大部分章节的最后都会附有一个最佳实践部分,其中很多的技巧都是我日常工作中总结出来的,对你来说一定也很适用。再比如说,书中会对Git的用法进行穿插讲解,并教你如何将代码托管到GitHub,如何将软件上架到Google Play,如何在软件中嵌入广告盈利等等等等,我就不一一举出了,等待你自己去发现。


    另外,为了让这本书读起来不会枯燥,我努力让自己的语言变得幽默,可毕竟在这方面不怎么擅长,做得不够好。但本书中引入的经验值、升级、宝物系统则很好地弥补了这一点,通过不断地阅读,你将会获得经验值、升级,并赢得匪夷所思的宝物,让你在阅读过程体会到更多的乐趣。这个系统是由陈冰写的,如果大家阅读之后对这个系统有什么反馈或建议,可以发送邮件给他(neosaga@126.com)。


    很多朋友私下里有问过我,应该怎样去学习Android才能有所提高,那么今天我可以给出答案了。书和博客结合在一起学习,建议先看书打牢基础,然后再看博客进行进阶,当你把书和博客中的内容都吃透了的时候,那么我会的东西你也就都会了。


    封面


    看到了这里,相信有些朋友已经迫不及待想要购买一本了吧?别着急,我们再来看一下这本书的封面。封面的设计不是由我负责的,但诞生的过程也算是经历了各种曲折。陈冰对封面的要求非常苛刻,既要有深度有含义,又要能吸引眼球,还要给人一种想要翻开的冲动。经过了两个月左右的设计,所谓的“本年度最佳封面终于出炉了”,我们来欣赏一下:




    红色作为亮色系的代表色,使得它可以在众多图书当中脱颖而出,让人一眼就能看见它。


    再来看一下宣传海报的样子:




    怎么样,有没有一种视觉震撼的感觉?!虽然最终的封面夺人眼球,但任何东西都不会是凭空出现的,创作的过程必然有它的艰辛和曲折,《第一行代码——Android》封面诞生记这篇文章中专门讲述了本书封面的诞生过程,感兴趣的朋友可以像看故事一样去了解了解。


    定价


    79元,看到这个价格时我相信很多朋友觉得并不便宜,但实际上这已经是我尽最大可能争取到的价格了。由于书的价格是由出版社根据页数来制定的,我并不能做过多干预。通常情况下五百多页的书都可以定价到八十几、九十几元,最低也不能低于79元,于是我果断申请了最低的价格。


    其实换一种思路来想,79元也不算贵,因为这只是书的原售价,而我们在网上买书的话通常都会打折,基本上也就只需要五十多块钱就可以买到了。另外我觉得买书不用太在意价格,而是应该更在意里面的内容,书的内容只要能够真正给你带来帮助,那么它的价值就是远远大于这几十块钱的(就我自己而言,我大学期间总共大概花了两千多块的生活费用于买书,这些书一直都珍藏在我的书架上,是我永久的财富)。


    购买


    了解了这么多,不知道你有没有下定决心要买一本呢?目前《第一行代码——Android》这本书已经在当当、京东、亚马逊、互动这几个网上书店上架了,有需要的小伙伴们请猛戳下面的地址:


    当当网购买地址

    京东购买地址

    亚马逊购买地址

    互动出版购买地址

    天猫购买地址


    然后


    书的出版算是我的程序之路上一个新的里程碑吧,然而人生的路还很长,未来仍然需要努力向前。因此,我后面还是会一如既往地坚持更新博客,自我提升的同时也分享给大家。因为博客的原因,我结识了很多天南海北的新朋友,感谢众多朋友以及亲人的一路陪伴,愿未来大家都能天天向上。


    书中源码下载地址:http://download.csdn.net/detail/sinyu890807/7747691


    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

            

    展开全文
  • 对《第一行代码第一章学习后,进行归纳总结。主要涉及到知识点有:Android系统架构、Android已发布的版本、Android Studio 的下载和开发环境的搭建、新建模拟器、创建Android项目的步骤。

    第一行代码第一章—你的第一行Android代码

    知识点目录

    • 1.1 了解全貌——Android王国简介
      * 1.1.1 Android系统架构
      * 1.1.2 Android已发布的版本
      * 1.1.3 Android应用开发特色
    • 1.2 手把手带你搭建开发环境
      * 1.2.1 准备所需要的工具
      * 1.2.2 搭建开发环境
    • 1.3 创建你的第一个Android项目
      * 1.3.1 创建HelloWorld项目
      * 1.3.2 启动模拟器
      * 1.3.3 运行HelloWorld
      * 1.3.4 分析你的第一个Android程序
      * 1.3.5 详解项目中的资源
      * 1.3.6 详解build.gradle文件
    • 1.4 前行必备——掌握日志工具的使用
      * 1.4.1 使用Android的日志工具
      * 1.4.2 为什么使用Log而不使用System.out
    • 1.5 小结与点评

    知识点回顾

    1.1 了解全貌——Android王国简介

    无知识点

    1.1.1 Android系统架构
    • Linux内核层

      为Android设备的各种硬件提供底层的驱动

    • 系统运行库层

      通过一些C/C++库为Android系统提供特性支持;还有Android运行时的库。

    • 应用框架层

      提供了构建应用程序时可能用到的各种API。

    • 应用层

      安装在手机上的应用程序

    1.1.2 Android已发布的版本

    最新数据可以访问如下网址:

    https://developer.android.google.cn/about/dashboards/index.html

    1.1.3 Android应用开发特色
    • 四大组件

      Activity、Service、BroadcastReceiver、ContentProvider

    • 丰富的系统控件

    • SQLite数据库

    • 强大的多媒体

    • 地理位置地位

    • and so on

    1.2 手把手带你搭建开发环境

    无知识点

    1.2.1 准备所需要的工具

    能翻墙的前提下,到Android官网下载开发工具

    https://developer.android.google.cn/studio/index.xml

    如果不能翻墙,则到下面的网址去下载。

    http://www.androiddevtools.cn/

    1.2.3 搭建开发环境

    下载Android Studio后,根安装普通软件一样,一路Next即可。

    1.3 创建你的第一个Android项目

    无知识点

    1.3.1 创建HelloWorld项目。
    1. 打开Android Studio,进入欢迎界面。
      AS的欢迎界面

    2. 点击Start a new Android Studio project,进入创建新项目界面
      创建新项目

    3. 进入设置项目的最低兼容版本
      设置项目的最低兼容版本

    4. 进入选择模板
      选择模板

    5. 给活动和布局命名
      给活动和布局命名

    6. 点击Finish按钮,进入到项目创建成功界面。

    1.3.2 启动模拟器

    点击下图中最左边的按钮就可以创建和启动模拟器。

    创建和启动模拟器

    但个人觉得Android Studio原生的模拟器不是很好用,所以我平时选用的是第三方的genymotion模拟器。

    genymotion下载网址如下:

    https://www.genymotion.com/account/login/

    需要先注册。

    1.3.3 运行HelloWorld
    • 启动模拟器

    • 点击顶部工具栏中的运行按钮

    • 在Select Deployment Target选中模拟器,点击OK按钮。

    1.3.4 分析你的第一个Android程序

    将项目结构模式切换成Project

    Project模式的项目结构

    下面介绍整个项目的外层目录结构。

    • .gradle和.idea

      Android Studio自动生成的文件,无需关心

    • app

      项目的代码和资源文件

    • build

      包含编译时自动生成的文件

    • gradle

      包含gradle wrapper的配置文件

    • .gitgnore

      将指定的目录或文件排除在版本控制之外

    • build.gradle

      项目全局的gradle构建脚本,一般都不需要修改

    • gradle.properties

      全局的gradle配置文件,直接影响项目中所有的gradle编译脚本

    • gradlew和gradlew.bat

      用来在命令行中执行gradle命令,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用。

    • HelloWorld.iml

      iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件,用于标识这是一个IntelliJ IDEA项目,无需修改该文件中的任何内容。

    • local.properties

      用于指定本机中SDK的路径,自动生成,无需修改。

    • settings.gradle

      指定项目中所有引入的模块

    展开app目录:

    app目录

    下面详细介绍下app目录下的内容

    • build

      编译时自动生成的文件,无需关心

    • libs

      存放第三方jar包,放在该目录下的jar包会自动添加到构建路径中去。

    • androidTest

      编写Android Test测试用例,对项目进行一些自动化测试。

    • Java

      存放所有Java代码

    • res

      存放项目中所有图片、布局、字符串等资源文件

    • AndroidManifest.xml

      Android项目配置文件

    • test

      编写Unit Test 测试用例,是对项目进行自动化测试的另一种方式

    • .gitgnore

      将app模块内指定的目录排除在版本控制之外

    • app.iml

      IntelliJ IDEA项目自动生成的文件

    • build.gradle

      app模块的gradle构建脚本

    • proguard-rules.pro

      指定项目代码的混淆规则

    1.3.5 详解项目中的资源文件

    无知识点

    1.3.6 详解build.gradle文件

    最外层目录下的build.gradle文件,代码如下:

    buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    	}
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    这些代码都是自动生成的,通常情况下不需要修改这个文件中的内容。两处repositories闭包中都声明了jcenter(),jcenter是一个代码托管仓库,从而使得我们在项目中可以引用任何jcenter上的开源项目。dependencies闭包中使用classpath声明了一个Gradle插件,因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多种项目都可以使用Gradle来构建。如果想要使用Gradle来构建Android项目,则需要声明com.android.tools.build:gradle:2.3.3这个插件,其中,后面是插件的版本号。

    app目录下的build.gradle文件,代码如下:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "27.0.0"
        defaultConfig {
            applicationId "com.example.helloworld"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:26.+'
        testCompile 'junit:junit:4.12'
    }
    

    首先第一行应用了一个插件,一般有两种值可选:com.android.application表示这是一个应用程序模块;com.android.library表示是一个库模块。应用程序模块是可以直接运行的,库模块只能作为代码库附于在别的应用程序模块来运行。

    android闭包:

    compileSdkVersion:指定项目的编译版本。

    buildToolsVersion:指定项目构建工具的版本。

    defaultConfig闭包:

    applicationId:指定项目的包名

    minSdkVersion:指定项目最低兼容的Android系统版本

    targetSdkVersion:指定项目的目标版本

    versionCode:指定项目的版本号

    versionName:指定项目的版本名

    buildTypes闭包:

    通常只会有两个子闭包:debug和release。其中debug闭包可以忽略不写。debug闭包用于指定生成测试版安装文件的配置;release闭包用于指定生成正式版安装文件的配置。

    release闭包

    minifyEnabled:指定是否对项目的代码进行混淆。

    proguardFiles:指定混淆时使用的规则文件。proguard-android.txt是在Android SDK目录下,里面是所有项目通用的混淆规则;proguard-rules.pro是在当前项目的根目录下,里面可以编写当前项目特有的混淆规则。

    dependencies闭包

    指定当前项目所有的依赖关系。

    compile fileTree:声明本地依赖,表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径中。

    compile:声明远程依赖。

    testCompile:声明测试用例库。

    1.4 前行必备——掌握日志工具的使用

    无知识点

    1.4.1 使用Android的日志工具Log
    • Log.v():打印最为琐碎的、意义最小的日志信息。(verbose)

    • Log.d():打印调试信息。(debug)

    • Log.i():打印重要的日志信息。(info)

    • Log.w():打印一些警告信息。(warn)

    • Log.e():打印程序中的错误信息。(error)

    日志等级由低到高:v -> d -> i -> w -> e

    运行程序的快捷键

    Windows : Shift + F10

    Mac : control + R

    1.4.2 为什么使用Log而不使用System.out
    • logcat中能添加过滤器

    • 可以控制日志级别

    1.5 小结与点评

    无知识点

    展开全文
  • 第一行代码 Android 第2版》 https://pan.baidu.com/s/1B718h7h3601iEe8gIN9oAQ

    《第一行代码 Android 第2版》
    https://pan.baidu.com/s/1B718h7h3601iEe8gIN9oAQ

    展开全文
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定...第一行代码(...
  • 第一章 开始启程,你的第一行Android代码1.1.Android简介 1.1.1.Android系统架构 自下而上:Linux内核层(为硬件提供底层驱动。eg:显示驱动、音频驱动等)、系统运行时层(C/C++库和android运行时库,前者有Sqlite...
  • Android第一行代码(第2版).pdfhttps://pan.baidu.com/s/1LaLTBiNlpK4XybROoSUPbg
  • 从来没有写书评的习惯,但书实在太差,还让我花了不少时间去阅读,所以必须写一下(本人已阅读:1,2,3,4,9章)。写之前我还去看过作者的博客,单一问题的描述能力不错,但组织并写好本书的能力基本为零。主要...
  • 行代码》中的内容我相信很多人都会非常感兴趣,因为里面确实加入了很多很新的知识。略粗概括一下的话,新增内容就包括有Android Studio、Gradle、Material Design、运行时权限、多窗口模式、RecyclerView、...
  • 第一行代码(第二版)第一章主要介绍了Android系统架构、重要版本、应用开发特色以及详细讲解了如何创建第一Android项目和如何创建模拟器,还详细讲解了AndroidStudio项目下比较重要的目录结构知识以及如何使用...
  • android第一行代码(第2版)_传送门
  • 目录: 1.1 了解全貌——Android王国简介 1.1.1 Android 系统架构 1.1.1 Android 已发布版本 1.1.3 Android 应用开发特色...1.3 创建你的第一Android项目 1.3.1 创建HelloWorld项目 1.3.2 启动模拟器 1.3.3...
  • 分享一本好书,入门Android看很容易理解。 《第一行代码 Android 第2版》-郭霖-人邮-2016.12 PDF [下载]
  • 第一行代码 Android 第2版-郭霖-人邮 PDF版链接:https://pan.baidu.com/s/1NktlZDlfTIc-WK3m-ZIs0g 密码:yqe8
  • 第一行代码——Android》这本书自2014年出版以来,已经过了6个年头了。期间Android系统版本经历了4.0到10.0系统的巨大升级,开发技术也发生了翻天覆地的变化。在2016年的时候,我曾对书中的内容进行了大幅度的更新...
  • 最近在学习Android开发,用的是郭大神的第一行代码这本书,怎么说呢,书是很好懂的,写的很明白,非常好的一本书,直接从前往后看就了,但是在跟书学的时候遇到了一些不容易解决的错误,或因版本更新,书上没有写...
  • 【3】3章 软件也要拼脸蛋,UI开发的点点滴滴 【3.1】UIWidgetTest package com.example.uiwidgettest; import android.support.v7.app.ActionBarActivity; import android.app.Activity; import android.app....
  • 郭霖老师,你好,在阅读你的《第一行代码Android》4.5节时,我模仿书中的步骤一步一步建立文件,在编写maxLines属性的值为true,android studio一直报错,改为数字1,2,3等数字,程序不报错,能正常运行,在模拟器...
  • 以我自己的理解,Android是在JAVA语言的基础上开发的(前几天的新闻好像说Android放弃了JAVA语言,已经全面支持kotlin语言)。所以需要准备的工具有JDK、Android SDK 、Android Studio,这些东西可以去Android官网...
  • 笔者前言最近在读郭霖大神的行代码,借助行代码,在这里我认真梳理Android知识,为了形成自己的知识体系。坚持写系列关于行代码的学习笔记,是来提升自己的学习能力,坚持每天学习; 二是给自己整理...
1 2 3 4 5 ... 20
收藏数 541,966
精华内容 216,786
关键字:

第一行代码 android