《第一行代码》笔记(25)——第十四章的酷欧天气

package com.zjw.mycoolweather.ui.activity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.zjw.mycoolweather.R;

//14 p486 进入实战——开发酷欧天气
//14.1 功能需求及可行性分析

/*
彩云天气与和风天气
彩云天气:数据更实时专业,天气预报可以精确到分钟级,每天1000次免费请求
和风天气:数据相对简单,适合新手学习,每天3000次免费请求,这里使用这个(注册后剩余访问流量显示4000?)
 */

/*
全国省市数据
郭霖大神架设的服务器:http://guolin.tech/api/china
返回一段JSON数据:
[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"天津"},
{"id":4,"name":"重庆"},{"id":5,"name":"香港"},{"id":6,"name":"澳门"},
{"id":7,"name":"台湾"},{"id":8,"name":"黑龙江"},{"id":9,"name":"吉林"},
{"id":10,"name":"辽宁"},{"id":11,"name":"内蒙古"},{"id":12,"name":"河北"},
{"id":13,"name":"河南"},{"id":14,"name":"山西"},{"id":15,"name":"山东"},
{"id":16,"name":"江苏"},{"id":17,"name":"浙江"},{"id":18,"name":"福建"},
{"id":19,"name":"江西"},{"id":20,"name":"安徽"},{"id":21,"name":"湖北"},
{"id":22,"name":"湖南"},{"id":23,"name":"广东"},{"id":24,"name":"广西"},
{"id":25,"name":"海南"},{"id":26,"name":"贵州"},{"id":27,"name":"云南"},
{"id":28,"name":"四川"},{"id":29,"name":"西藏"},{"id":30,"name":"陕西"},
{"id":31,"name":"宁夏"},{"id":32,"name":"甘肃"},{"id":33,"name":"青海"},
{"id":34,"name":"新疆"}]

访问某个省份有哪些城市:http://guolin.tech/api/china/省份id
如:http://guolin.tech/api/china/16
返回:
[{"id":113,"name":"南京"},{"id":114,"name":"无锡"},{"id":115,"name":"镇江"},
{"id":116,"name":"苏州"},{"id":117,"name":"南通"},{"id":118,"name":"扬州"},
{"id":119,"name":"盐城"},{"id":120,"name":"徐州"},{"id":121,"name":"淮安"},
{"id":122,"name":"连云港"},{"id":123,"name":"常州"},{"id":124,"name":"泰州"},
{"id":125,"name":"宿迁"}]

访问某个城市有哪些县、区:http://guolin.tech/api/china/省份id/城市id
如:http://guolin.tech/api/china/16/116
返回:
[{"id":937,"name":"苏州","weather_id":"CN101190401"},
{"id":938,"name":"常熟","weather_id":"CN101190402"},
{"id":939,"name":"张家港","weather_id":"CN101190403"},
{"id":940,"name":"昆山","weather_id":"CN101190404"},
{"id":941,"name":"吴中","weather_id":"CN101190405"},
{"id":942,"name":"吴江","weather_id":"CN101190407"},
{"id":943,"name":"太仓","weather_id":"CN101190408"}]
用里面的weather_id去访问和风天气接口
 */

/*
和风天气接口使用:
1.注册:
http://guolin.tech/api/weather/register
http://console.heweather.com/register
2.登录
登录后有个人认证key(可每月修改一次),剩余每天访问流量
获取天气信息:
http://guolin.tech/api/weather/?cityid=所需查询地方的“weather_id”&key=个人认证key
如http://guolin.tech/api/weather/?cityid=CN101190401&key=24c232ca7bde41cf824dec83f4f411b8
返回大体结构:
{
    "HeWeather":[
        {"aqi":{},
         "basic":{},
         "daily_forecast": [],
         "hourly_forecast": [],
         "now": {},
         "status": "ok",
         "suggestion": {}
    ]
}
"status": "ok"表示成功
"basic":包含城市基本信息
"aqi":当前空气质量情况
"now":当前天气信息
"suggestion":天气相关生活建议
"daily_forecast":未来几天天气信息
详细说明文档:http://guolin.tech/api/weather/doc
 */

//14.2 p489 Git时间——将代码托管到GitHub上
/*
代码托管:
GitHub:https://github.com/  《第一行代码》上使用的,全球最大代码托管网站,全英文,不做一些配置可能网速较慢,资源加载不全
码云:https://git.oschina.net/ 中文亲切,创建流畅
我自己这边是github上网速超级慢,并且gitignore,liscense文件都创建不出来,删项目点了也完全没反应那种,
网上查要自己配host映射,或是用代理等,原因是一些域名被墙了,我感觉弄起来有点麻烦(有不麻烦的但是要花钱)
码云用着挺方便的,就用码云了
 */

//14.3 p494 创建数据库和表
/*
1.分包:
    db:数据库模型相关
    gson:GSON模型相关
    service:服务相关
    util:工具相关
2.添加依赖
    compile 'org.litepal.android:core:1.5.1'    进行数据库操作
    compile 'com.google.code.gson:gson:2.8.0'   进行解析JSON数据
    compile 'com.squareup.okhttp3:okhttp:3.8.1'     进行网络请求
    compile 'com.github.bumptech.glide:glide:3.7.0'     加载展示图片
3.数据库准备建立三张表
    province、city、country分别存放省市县数据
    对应实体bean: Province、City、Country
4. 配置litepal.xml文件
     数据库参考配置文档:https://github.com/LitePalFramework/LitePal
 */

//14.4 p499 遍历全国省市县数据
/*
1.封装网络请求工具HttpUtil
2.封装解析和处理JSON格式数据工具Utility
3.遍历全国省市县数据功能要复用,不写活动里,写碎片里
    写choose_area.xml布局
    写遍历全国省市县数据的碎片,ChooseAreaFragment继承Fragment
4.写主布局
5.去掉原生标题栏
6.加联网权限
 */

//14.5 p509 显示天气信息
//和风天气返回数据较为复杂,使用GSON来对天气信息进行解析

//14.5.1 p509 定义GSON实体类
//书里是自己写的类,我偷懒直接GsonFormat插件来生成类

//14.5.2 p514 编写天气界面
/*
1.创建一个用于显示天气信息的活动,WeatherActivity
2.写显示天气信息活动的相应布局layout/activity_weather.xml
 */

//14.5.4 p520 将天气显示到界面上
/*
1.Utility中添加一个用于解析天气JSON数据的方法
2.写WeatherActivity,请求天气数据,将数据展示到界面上
3.修改ChooseAreaFragment,实现从省市列表界面跳转到天气界面
4.修改MainActivity,加入缓存数据的判断
 */

//14.5.4 p526 获取必应每日一图
/*
获取必应每日一图的接口:http://guolin.tech/api/bing_pic
返回今日必应背景图链接:http://cn.bing.com/az/hprichbg/rb/MahoneSilhouettes_ROW11507704520_1920x1080.jpg
再用Glide去加载图片即可
改layout/activity_weather.xml,WeatherActivity代码
 */
/*
背景图和状态栏融合:
改WeatherActivity代码:
  if(Build.VERSION.SDK_INT>=21){
            View decorView=getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
其中DecorView:
    一、DecorView为整个Window界面的最顶层View。
    二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。
    三、LinearLayout里有两个FrameLayout子元素。
        1为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏View将加入FrameLayout中。
        2为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中
此时头布局会和系统状态栏紧贴在一起,activity_weather布局加入android:fitsSystemWindows="true"解决
 */

//14.6 p532 手动更新天气和切换城市
//14.6.1 p532 手动更新天气
/*
用下拉刷新来实现让用户手动更新天气信息
1.改activity_weather布局,WeatherActivity类
 */

//14.6.2 p535 切换城市
/*
更改头布局,加一个按钮
再在activity_weather布局中加入DrawerLayout,滑动菜单显示遍历省市县数据碎片
去ChooseAreaFragment改切换城市后的逻辑
 */

//14.7 p540 后台自动更新天气
/*
需要创建一个长期在后台运行的定时任务
创建一个AutoUpdateService服务
 */

//14.8 p542 修改图标和名称

//15.1 p545 生成正式签名的APK文件
/*
运行程序都使用了debug.keystore文件来进行签名
Store: C:\Users\hp\.android\debug.keystore
 */

//15.1.1 p546 使用Android Studio生成
/*
Buile->Generate Signed APK->Create new
 */

//15.1.2 p584 使用Gradle生成
/*(没试过)
在app的build.gradle的android标签下加入如下
signingConfigs {
    config{
        storeFile file('E:/my_program/data/first_line/zjw.jks')//文件存储位置
        storePassword '1234567'//密码
        keyAlias 'zjw'//别名
        keyPassword '1234567'//别名密码
    }
}
buileTypes{
   release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.config
    }
}
右侧工具栏Gradle->项目名->:app->Tasks->build->assembleDebug生成测试版APK,assembleRelease生成正式版APK
assemble同时生成测试版正式版APK,生成前先clean
为了安全,将数据存放于gradle.properties里,Gradle里直接读取

gradle.properties:
KEY_PATH=E:/my_program/data/first_line/zjw.jks
KEY_PASS=1234567
ALIAS_NAME=zjw
ALIAS_PASS=1234567

Gradle:
 config{
        storeFile file(KEY_PATH)//文件存储位置
        storePassword KEY_PASS//密码
        keyAlias ALIAS_NAME//别名
        keyPassword ALIAS_PASS//别名密码
    }
 */

//15.1.3 p551 生成多渠道APK文件
/*
android标签下
productFlavors{
        qihoo{
            applicationId "com.zjw.mycoolweather.android.qihoo"
        }
        baidu{
            applicationId "com.zjw.mycoolweather.android.baidu"
        }
    }
 */

//15.2 p554 申请360开发账号
/*
申请地址:http://dev.360.cn
登录后打开:http://dev.360.cn/mod/developer,申请成为开发者
 */

/*
17/8/13 不知道什么情况,大神服务器连不上
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        if (sharedPreferences.getString("weather", null) != null) {
            Intent intent = new Intent(this, WeatherActivity.class);
            startActivity(intent);
            finish();
        }
    }
}

转载于:https://my.oschina.net/u/3620480/blog/1507448

你可能感兴趣的:(《第一行代码》笔记(25)——第十四章的酷欧天气)