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(); } } }