动手实现天气预报App(四)——完善、apk打包与总结

完善与总结

更换图标和名称

应该给icon图标提供几种不同分辨率的版本,然后分别放入到相应分辨率的 mipmap目录下。

将这张图片命名成 logo.png,放入到所有以 mipmap开头的目录下,然后修改 Android Manifest xml中的代码,如下所示

<application
    android:name="org.litepal.LitePalApplication"
    android:allowBackup="true"
    android:icon="@mipmap/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

将icon标签下指定为mipmap下的logo就可以修改图标了。

更改app的名称就更简单了,只需要将strings中app_name更改为想要的就行。

在这里插入图片描述

<resources>
    <string name="app_name">我的天气</string>
</resources>

这时运行一遍程序就可以看到名称和图标都已更改了。

在这里插入图片描述

生成签名APK及打包程序

众所周知Android系统会将所有的APK文件识别为应用程序的安装包,类似于 Window
系统上的EXE文件进行安装。
但并不是所有的APK文件都能成功安装到手机上, Android系统要求只有签名后的APK文件才可以安装,因此我们还需要对生成的APK文件进行签名才行。那么似乎直接通过 Android Studio来运行程序的时候并没有进行过签名操作也可以直接安装,这是因为 Android Studio使用了一个默认的 keystore文件帮我们自动进行了签名。
在这里插入图片描述

在这里插入图片描述

生成正式签名

在build中找到生成签名:

在这里插入图片描述

第一次没有一个正式的keystore文件,所以应该新创建一个:

在这里插入图片描述

创建后可以记住密码 以后选择好输出位置直接点下一步就行。

在这里插入图片描述

在这里插入图片描述

总结

到此我已经跟着书完成了整个天气app,体会到项目从创建到实现的流程,收获了很多经验,在此进行一些总结。

  1. 首先是对于安卓移动端数据的存储有了初步的认识,之前学习中使用的都是临时存储在内存中,可能下次运行就没有了,项目中使用到SharedPreferences缓存,这是一种对少量数据缓存的方法,比如加载到的天气数据在下次请求时就可以去里面直接取出来而避免了再去网络申请耽误时间和流量,其中的数据存储方法是键值对的方式存储,存取时一般通过字符串key来操作;另一个就是安卓自带的sqlite的使用,这里用到了 LiteRal,可以用面向对象的思维来实现数据库相关操作,比如定义一个 Java bean来对应一个数据表,避免了编写sql语句容易出现的错误。

  2. 第二个就是工具包的编写,在项目中可以将常用操作如网络请求编写为工具类来重复使用,如本项目中将网络请求封装为HttpUtil类,将请求天气信息、处理天气响应、获取省市县列表封装到一个类中。在HttpUtilsendOkHttpRequest(String address,Callback callback)的方法可以总结为套路方法,先是创建一个OkHttpClient实例,之后创建Request传入地址来构建请求,之后调用OkhttpClient的newCall()方法来创建一个Call对象,并调用它的execute()方法来发送这个请求并获取服务器返回的数据放入传入的callback回调函数。

    之后在使用时就可以直接处理newCallback(),复写onFailure和onResponse方法来处理回调内容。

  3. 第三就是学会了解析JSON数据,在项目中首先是对请求到JSON数据格式进行大概的了解,然后对他们进行分类。如果是长久不变的类可以继承自litepal,然后再解析完一次JSON数据放入相应的实例类并存入数据库,如省市县列表,另一方像天气信息这种经常变换的信息可以创建JSON类来对应JSON数据,要注意JSON类中的类要对应相应的内部类,如Forecast中包含气温,气温中又包含最大和最小,所以需要内部类来表示预报类中的气温。在全部JSON类构建完后需要一个大类进行整合,如weather将他们全部定义,如果遇到重复的可以使用泛型List。

  4. 对于碎片的使用,开始看书时并不觉得碎片有什么用,觉得除了可以兼容平板好像没什么太大用处,和活动的用法类似,但看到后面整合到天气信息页面时才发现它的妙处,原来他最大的作用是解决一些活动的重复应用,使用碎片可以一次编辑多处使用,既可实现类似活动的效果,又可以像控件一样随处嵌入,如本项目中就嵌入到天气信息的滑动侧边栏中,滑出时候就可以像控件一样操作碎片。

  5. 这里使用了一个Java中的小技巧, instanceof关键字可以用来判断一个对象是否属于某个类的实例。我们在碎片中调用 getActivity()方法,然后配合 instanceof关键字,就能轻松判断出该碎片是在 MainActivity当中,还是在 WeatherActivity当中。如果是在 MainActivity当中,那么处理逻辑不变。如果是在 WeatherActivity当中,那么就关闭滑动菜单,显示下拉刷新进度条,然后请求新城市的天气信息。

  6. SwipeRefreshLayout下拉刷新的使用主要是将想要实现下拉的布局包裹,修改的代码并不算多,首先在 onCreate()方法中获取到了 SwipeRefreshLayout的实例,然后调用setcolorschemeresources()方法来设置下拉刷新进度条的颜色。然后调用 setOnRefreshListener()方法来设置一个下拉刷新的监听器,当触发了下拉刷新操作的时候,就会回调这个监听器的 onRefresh()方法。

  7. 服务的使用,项目中利用服务来实现天气的后台自动刷新,之后就是创建定时任务的技巧了,为了保证软件不会消耗过多的流量,这里将时间间隔设置为8小时,8小时后onstartcommand()方法就会重新执行。主要分为声明服务,创建服务类,启动服务和绑定服务几个步骤,在官方文档中这部分也讲得很详细。其中要注意绑定服务允许应用组件通过调用 bindService() 与其绑定,从而创建长期连接,如支付服务的拉起等等。这类服务通常不允许组件通过调用 startService()启动它。

  8. 最后是应用icon和名称的修改,APP签名和apk的打包,了解到如果不签名App无法安装。

  9. 学会使用git和github进行项目版本的管理。

  10. 经过这个项目对之前学习到的各个知识点进行了贯通和汇总,对Android四大组件有了更深的了解,也发现了很多不足之处,下一步计划通过更加复杂的项目来学习更多知识。

猜你喜欢

转载自blog.csdn.net/kilotwo/article/details/108438189
今日推荐