# 基于 Android 的天气 APP
---
# 功能
1. 第一次打开 APP 引导页,缓冲加载
2. 天气信息的显示
3. 广告,推送
4. 桌面小工具
5. 新闻资讯的查看
6. 蓝牙串口传输温度
---
那时候还不大会使用 Gson,简直就是 Android 开发的败笔呀~傻乎乎的自己去解析近千的 JSON 信息,也是醉了。
# 准备
易源数据中的天气 JSON 如果请求的是 15 天的 JSON 数据那有近千行,所以取自己有用的。
- 开发环境:Android studio
- 数据获取:易源数据 SDK
## 帮助工具
JSON 在线解析
[易源数据官网](https://link.juejin.cn/?target=https%3A%2F%2Fwww.showapi.com%2F)
---
# JSON 数据分析
![](https://www.writebug.com/myres/static/uploads/2021/11/23/4b392b4301d717692d7b8755f1c50054.writebug)
*image*
这么多 Json,细思极恐啊~
不过我们一步步来分析,key 的作用可以看易源的文档。
1. cityInfo 城市信息
2. time 时间
3. now 现在的天气
4. f1~f6 近一星期的天气预报信息
5. alarmList 预警信息
6. hourDataList 半小时更新一次的天气信息
7. aqi 空气质量
## 天气封装
在目录下新建 com.weather.entity
其实觉得 Gson 挺好用的……
那我为何不用 Gson 呢。。。因为那时候还不会用@Serializedname,易源数据的 JSON 竟然还有用数字开头的 key ┭┮﹏┭┮
然后经过了一番的倒腾,终于一个个把数据给对上了= =,当做自己解析 JSON 数据的练手吧
## 网络请求
主要是用 okhttp,用到的是郭神的几行代码
```
public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}复制代码
```
直接传入地址就请求到数据了,
不过这边有个坑!!
有个坑!!!
有个坑!!!
重要的事情所三遍
在请求后不能直接使用 response.body().string(),要缓存一下才能使用,不然为空。
```
//使用okhttp的封装进行请求
HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
//这里有坑
String responseText = response.body().string();复制代码
```
## 数据库
本人数据库超级烂,不过不算渣渣,还是能写点东西,数据库我设计的十分简单,只有两个重要的属性,就是城市名和 JSON 数据,为的是在无网络状态下从数据库直接获取到 JSON 数据,解析后显示到界面上。
框架的话本来打算用 GreenDao 的,不过后面改成 LitePal 了。
```
public class WeatherDB extends DataSupport {
public int id;
public String mCityName;
public String mJsonData;
...复制代码
```
## 广告,推送
广告用的是有米广告,直接对着 SDK 把代码加进去就好了,想用腾讯的广告,但是打电话给我问我有没营业执照。。。。晕,没有所以没有审核通过。
推送使用的是极光推送,也是直接使用 SDK,本来使用的是 BOMB 的,但是 Bomb SDK 中的 okhttp 和我自己的依赖起冲突了,而且还有一些机子无法推送成功,所以最后改成了极光推送,这都是血淋淋的坑啊,一步步踩过来简直吐血。
```
//广告条初始化
View bannerView = BannerManager.getInstance(WeatherActivity.this)
.getBannerView(WeatherActivity.this, new BannerViewListener() {
@Override
public void onRequestSuccess() {}
@Override
public void onSwitchBanner() {}
@Override
public void onRequestFailed() {}
});
// 获取要嵌入广告条的布局
LinearLayout bannerLayout = (LinearLayout) findViewById(R.id.ll_banner);
// 将广告条加入到布局中
bannerLayout.addView(bannerView);复制代码
```
嵌入广告就是这么简单暴力,但是建议用积分墙,我这个是广告条。。。。。
因为。。。
他们广告条好像没啥广告。。。可能在实际中显示不出来,不过在初始化时使用测试广告的话那就可以看到了。
## 城市选择
这里推荐别人写的一个依赖,直接传送门 [CityPicker](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzaaach%2FCityPicker)
用的是高德地图定位
![](https://www.writebug.com/myres/static/uploads/2021/11/23/ff7240dfa013c783f18cd32e96102fb5.writebug)
*image*
## 桌面小工具
这方面我需要学习的东西还有很多的,开启服务在后台更新,想想后期如果能加入 Rxjava,看看能不能优化一些操作,不过在使用 Glide 加载图片到 AppWidget 时需要获取到 ImageView 控件,所以有折腾了一下。
![](https://www.writebug.com/myres/static/uploads/2021/11/23/b71eeb2c8f0d93bfcb4203022455ebc1.writebug)
*image*
```
//通过APPWIdgetTarget获取到Image控件
mAppWidgetTarget =new AppWidgetTarget(getApplicationContext(),mRemoteViews,R.id.appwiget_picture,mAppwidgetId);
Glide.with(getApplicationContext()).load(weatherBean.getmNowWeatherBean().getmWeather_Pic()).asBitmap().into(mAppWidgetTarget);复制代码
```
## 蓝牙和单片机通信模块
因为本人学过嵌入式开发,在机缘巧合的时候接触了 Android,所以现在做 Android 开发,单片机上使用的是 DS18B20 温度传感器,蓝牙是 HC-05,通过串口进行温度传输,不要觉得很难,其实很简单,嗯,说笑的,基础好就很简单啦,代码并不多,曾经试过一次返回数据一直都是乱码,找了一个星期的问题都没找到,最后发现是波特率的问题,太感动了,[传送门](https://link.juejin.cn/?target=http%3A%2F%2Fnote.youdao.com%2F)
## 界面
进入 APP 加载界面,淡入淡出效果,弱引用持有 Activity 对象,文字动画效果
![](https://www.writebug.com/myres/static/uploads/2021/11/23/60dae2a27296af6f2f5de2c3263c2239.writebug)
*缓冲界面*
```
//activity切换的淡入淡出效果
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);复制代码
//弱引用的使用
private static class SwitchHandler extends Handler {
private WeakReference<SplashActivity> mWeakReference;
SwitchHandler(SplashActivity activity) {
mWeakReference = new WeakReference<SplashActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
SplashActivity activity = mWeakReference.get();
if (activity != null) {
WeatherActivity.launch(activity);
activity.finish();
}
}
}复制代码
```
## 主界面
![](https://www.writebug.com/myres/static/uploads/2021/11/23/eb016fc753f1c2940fd74eb7f01ed85d.writebug)
*image*
这边其实没有按照 Material design 的要求透明化状态栏,主界面填充整个手机屏幕,通过计算手机屏幕总高度,减去状态栏的高度和 ActionBar 的高度,得出了主界面视图的高度,就做到了在任何分辨率下都只显示这样的界面的效果(原谅我这种拗口的表达,你懂就好哈哈哈哈~~)
```
/**
* 获取手机屏幕高度
*
* @param context
* @return
*/
public static int getDisplayHeight(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
// 获取屏幕信息
wm.getDefaultDisplay().getMetrics(dm);
return dm.heightPixels;
}
/**
* 获取手机屏幕宽度
*
* @param context
* @return
*/
public static int getDis
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于 Android 的天气 APP【100012611】 (667个子文件)
ViewPagerIndecatorLibrary-debug.aar 60KB
ViewPagerIndecatorLibrary-release.aar 60KB
SlidingMenulibrary-debug.aar 46KB
SlidingMenulibrary-release.aar 46KB
MediaSessionCompat.aidl 787B
ParcelableVolumeInfo.aidl 689B
PlaybackStateCompat.aidl 688B
MediaMetadataCompat.aidl 680B
ResultReceiver.aidl 675B
RatingCompat.aidl 673B
resources-debug-androidTest.ap_ 21KB
resources-debug-androidTest.ap_ 3KB
多知天气.apk 7.32MB
app-release.apk 7.31MB
gradlew.bat 2KB
TitlePageIndicator.class 21KB
TitlePageIndicator.class 21KB
CustomViewAbove.class 21KB
CustomViewAbove.class 21KB
SlidingMenu.class 19KB
SlidingMenu.class 19KB
CirclePageIndicator.class 13KB
CirclePageIndicator.class 13KB
CustomViewBehind.class 12KB
CustomViewBehind.class 12KB
LinePageIndicator.class 11KB
LinePageIndicator.class 11KB
UnderlinePageIndicator.class 11KB
UnderlinePageIndicator.class 11KB
TabPageIndicator.class 8KB
TabPageIndicator.class 8KB
IconPageIndicator.class 5KB
IconPageIndicator.class 5KB
IcsLinearLayout.class 5KB
IcsLinearLayout.class 5KB
SlidingActivityHelper.class 4KB
SlidingActivityHelper.class 4KB
R$styleable.class 4KB
R$styleable.class 4KB
CanvasTransformerBuilder.class 4KB
CanvasTransformerBuilder.class 4KB
SlidingListActivity.class 3KB
SlidingListActivity.class 3KB
SlidingPreferenceActivity.class 3KB
SlidingPreferenceActivity.class 3KB
SlidingFragmentActivity.class 3KB
SlidingFragmentActivity.class 3KB
SlidingActivity.class 3KB
SlidingActivity.class 3KB
R$attr.class 2KB
R$attr.class 2KB
SlidingMenu$1.class 2KB
SlidingMenu$1.class 2KB
CanvasTransformerBuilder$3.class 2KB
CanvasTransformerBuilder$3.class 2KB
SlidingMenu$SavedState.class 2KB
SlidingMenu$SavedState.class 2KB
CanvasTransformerBuilder$5.class 2KB
CanvasTransformerBuilder$5.class 2KB
CanvasTransformerBuilder$4.class 2KB
CanvasTransformerBuilder$4.class 2KB
R$color.class 2KB
R$color.class 2KB
UnderlinePageIndicator$SavedState.class 2KB
UnderlinePageIndicator$SavedState.class 2KB
CirclePageIndicator$SavedState.class 2KB
CirclePageIndicator$SavedState.class 2KB
TitlePageIndicator$SavedState.class 2KB
TitlePageIndicator$SavedState.class 2KB
LinePageIndicator$SavedState.class 2KB
LinePageIndicator$SavedState.class 2KB
TitlePageIndicator$IndicatorStyle.class 2KB
TitlePageIndicator$IndicatorStyle.class 2KB
TabPageIndicator$1.class 2KB
TabPageIndicator$1.class 2KB
TitlePageIndicator$LinePosition.class 2KB
TitlePageIndicator$LinePosition.class 2KB
CanvasTransformerBuilder$6.class 2KB
CanvasTransformerBuilder$6.class 2KB
TabPageIndicator$TabView.class 1KB
TabPageIndicator$TabView.class 1KB
SlidingMenu$SavedState$1.class 1KB
SlidingMenu$SavedState$1.class 1KB
UnderlinePageIndicator$SavedState$1.class 1KB
UnderlinePageIndicator$SavedState$1.class 1KB
CirclePageIndicator$SavedState$1.class 1KB
CirclePageIndicator$SavedState$1.class 1KB
SlidingMenu$2.class 1KB
SlidingMenu$2.class 1KB
TitlePageIndicator$SavedState$1.class 1KB
TitlePageIndicator$SavedState$1.class 1KB
LinePageIndicator$SavedState$1.class 1KB
LinePageIndicator$SavedState$1.class 1KB
R$styleable.class 1KB
R$styleable.class 1KB
R$styleable.class 1KB
R$dimen.class 1KB
R$dimen.class 1KB
R$styleable.class 1KB
UnderlinePageIndicator$1.class 1KB
共 667 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
神仙别闹
- 粉丝: 2714
- 资源: 7669
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功