#趣米杯#码农天气--码农自己的天气APP(四)

来源:互联网 发布:iphone连接mac传照片 编辑:程序博客网 时间:2024/06/06 08:50
本文参与趣米杯征文活动,如需转载请注明出处和作者


#趣米杯#码农天气--码农自己的天气APP(一)
#趣米杯#码农天气--码农自己的天气APP(二)
#趣米杯#码农天气--码农自己的天气APP(三)

之前我们已经实现了一个天气app的基本功能,这一篇文章我会介绍几个给app添彩的功能:通知栏,桌面widget,以及最近大家都很关心的PM2.5。
首先简单说一下通知栏的实现,这个功能做起来很简单,只要你把布局文件设计好,然后通过NotificationManager展示一下就可以了,取消的时候也是通过NotificationManager来取消,这一块应该没有什么难度,我把我反解的彩虹天气的通知栏布局文件贴出来,大家借鉴一下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:id="@+id/widgetRL"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     android:layout_margin="0.0dip" >

  7.     <TextView
  8.         android:id="@+id/cityTV"
  9.         style="\@style/NotificationTitle"
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content"
  12.         android:layout_alignParentLeft="true"
  13.         android:layout_marginLeft="8.0dip"
  14.         android:layout_marginTop="2.0dip"
  15.         android:textSize="16.0dip"
  16.         android:textStyle="bold" />

  17.     <TextView
  18.         android:id="@+id/todayTempNow"
  19.         style="\@style/NotificationText"
  20.         android:layout_width="wrap_content"
  21.         android:layout_height="wrap_content"
  22.         android:layout_below="@id/cityTV"
  23.         android:layout_marginLeft="15.0dip"
  24.         android:layout_marginTop="-4.0dip"
  25.         android:textSize="22.0dip" />

  26.     <LinearLayout
  27.         android:id="@+id/days"
  28.         android:layout_width="195.0dip"
  29.         android:layout_height="wrap_content"
  30.         android:layout_alignParentRight="true"
  31.         android:layout_centerVertical="true"
  32.         android:orientation="horizontal" >

  33.         <LinearLayout
  34.             android:layout_width="fill_parent"
  35.             android:layout_height="fill_parent"
  36.             android:layout_weight="2.0"
  37.             android:gravity="center_horizontal"
  38.             android:orientation="vertical" >

  39.             <TextView
  40.                 android:id="@+id/tvDay1"
  41.                 style="\@style/NotificationText"
  42.                 android:layout_width="fill_parent"
  43.                 android:layout_height="wrap_content"
  44.                 android:gravity="center"
  45.                 android:textSize="10.0dip" />

  46.             <ImageView
  47.                 android:id="@+id/imgIcon1"
  48.                 android:layout_width="32.0dip"
  49.                 android:layout_height="32.0dip"
  50.                 android:padding="3.0dip"
  51.                 android:scaleType="fitXY" />

  52.             <TextView
  53.                 android:id="@+id/tvTemp1"
  54.                 style="\@style/NotificationText"
  55.                 android:layout_width="wrap_content"
  56.                 android:layout_height="wrap_content"
  57.                 android:textSize="10.0dip" />
  58.         </LinearLayout>

  59.         <LinearLayout
  60.             android:layout_width="fill_parent"
  61.             android:layout_height="fill_parent"
  62.             android:layout_weight="2.0"
  63.             android:gravity="center_horizontal"
  64.             android:orientation="vertical"
  65.             android:paddingLeft="2.0dip"
  66.             android:paddingRight="2.0dip" >

  67.             <TextView
  68.                 android:id="@+id/tvDay2"
  69.                 style="\@style/NotificationText"
  70.                 android:layout_width="fill_parent"
  71.                 android:layout_height="wrap_content"
  72.                 android:gravity="center"
  73.                 android:textSize="10.0dip" />

  74.             <ImageView
  75.                 android:id="@+id/imgIcon2"
  76.                 android:layout_width="32.0dip"
  77.                 android:layout_height="32.0dip"
  78.                 android:padding="3.0dip"
  79.                 android:scaleType="fitXY" />

  80.             <TextView
  81.                 android:id="@+id/tvTemp2"
  82.                 style="\@style/NotificationText"
  83.                 android:layout_width="wrap_content"
  84.                 android:layout_height="wrap_content"
  85.                 android:textSize="10.0dip" />
  86.         </LinearLayout>

  87.         <LinearLayout
  88.             android:layout_width="fill_parent"
  89.             android:layout_height="fill_parent"
  90.             android:layout_weight="2.0"
  91.             android:gravity="center_horizontal"
  92.             android:orientation="vertical" >

  93.             <TextView
  94.                 android:id="@+id/tvDay3"
  95.                 style="\@style/NotificationText"
  96.                 android:layout_width="fill_parent"
  97.                 android:layout_height="wrap_content"
  98.                 android:gravity="center"
  99.                 android:textSize="10.0dip" />

  100.             <ImageView
  101.                 android:id="@+id/imgIcon3"
  102.                 android:layout_width="32.0dip"
  103.                 android:layout_height="32.0dip"
  104.                 android:padding="3.0dip"
  105.                 android:scaleType="fitXY" />

  106.             <TextView
  107.                 android:id="@+id/tvTemp3"
  108.                 style="\@style/NotificationText"
  109.                 android:layout_width="wrap_content"
  110.                 android:layout_height="wrap_content"
  111.                 android:textSize="10.0dip" />
  112.         </LinearLayout>

  113.         <LinearLayout
  114.             android:layout_width="fill_parent"
  115.             android:layout_height="fill_parent"
  116.             android:layout_weight="2.0"
  117.             android:gravity="center_horizontal"
  118.             android:orientation="vertical" >

  119.             <TextView
  120.                 android:id="@+id/tvDay4"
  121.                 style="\@style/NotificationText"
  122.                 android:layout_width="fill_parent"
  123.                 android:layout_height="wrap_content"
  124.                 android:gravity="center"
  125.                 android:textSize="10.0dip" />

  126.             <ImageView
  127.                 android:id="@+id/imgIcon4"
  128.                 android:layout_width="32.0dip"
  129.                 android:layout_height="32.0dip"
  130.                 android:padding="3.0dip"
  131.                 android:scaleType="fitXY" />

  132.             <TextView
  133.                 android:id="@+id/tvTemp4"
  134.                 style="\@style/NotificationText"
  135.                 android:layout_width="wrap_content"
  136.                 android:layout_height="wrap_content"
  137.                 android:textSize="10.0dip" />
  138.         </LinearLayout>
  139.     </LinearLayout>

  140.     <ImageView
  141.         android:id="@+id/todayImg"
  142.         android:layout_width="wrap_content"
  143.         android:layout_height="46.0dip"
  144.         android:layout_alignParentTop="true"
  145.         android:layout_marginLeft="10.0dip"
  146.         android:layout_marginRight="10.0dip"
  147.         android:layout_marginTop="4.0dip"
  148.         android:layout_toLeftOf="@id/days"
  149.         android:layout_toRightOf="@id/todayTempNow"
  150.         android:padding="3.0dip"
  151.         android:src="@drawable/day0" />

  152.     <TextView
  153.         android:id="@+id/tvTemp"
  154.         style="\@style/NotificationText"
  155.         android:layout_width="wrap_content"
  156.         android:layout_height="wrap_content"
  157.         android:layout_below="@id/todayTempNow"
  158.         android:layout_marginLeft="8.0dip"
  159.         android:layout_marginTop="-3.0dip"
  160.         android:textSize="12.0dip" />

  161.     <TextView
  162.         android:id="@+id/tvDes"
  163.         style="\@style/NotificationText"
  164.         android:layout_width="wrap_content"
  165.         android:layout_height="wrap_content"
  166.         android:layout_below="@id/todayTempNow"
  167.         android:layout_marginLeft="10.0dip"
  168.         android:layout_marginRight="10.0dip"
  169.         android:layout_marginTop="-3.0dip"
  170.         android:layout_toLeftOf="@id/days"
  171.         android:layout_toRightOf="@id/todayTempNow"
  172.         android:gravity="center"
  173.         android:textSize="12.0dip" />

  174. </RelativeLayout>
复制代码

下面我们介绍一下桌面widget的实现,上面这个是彩虹天气的,下面的那个是码农天气的:

 


大家可以看到我做的这个比彩虹天气的少了一个农历日期的展示,其实这块是我偷懒了,我没有加上,大家如果有兴趣的话,可以自己尝试着加一下。
看完效果,我们看一下桌面Wigdet的原理,其实他就是一个广播接收者BroadcastReceiver,这是android的源码:
  1. public class AppWidgetProvider extends BroadcastReceiver {
  2.     /**
  3.      * Constructor to initialize AppWidgetProvider.
  4.      */
  5.     public AppWidgetProvider() {
  6.     }
  7.     // 。。。。其他的代码我就不贴了
  8. }
复制代码

大家掌握这一点,对于桌面widget的理解就简单多了,他只需要接收指定的广播,就可以做一些预定义好的更新事件了。
彩虹天气有好几种widget的形式,我只是选了其中一种来实现的,大家有兴趣的话可以都试试。
这个是我的widget的布局文件,同样也是反解的彩虹天气的:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >

  6.     <RelativeLayout
  7.         android:id="@+id/widgetsRL"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent"
  10.         android:layout_margin="8.0dip" >

  11.         <ImageView
  12.             android:id="@+id/bgImg"
  13.             android:layout_width="fill_parent"
  14.             android:layout_height="fill_parent"
  15.             android:scaleType="fitXY"
  16.             android:src="@drawable/widget_black_bg" />

  17.         <TextView
  18.             android:id="@+id/clickTV"
  19.             android:layout_width="fill_parent"
  20.             android:layout_height="fill_parent" />

  21.         <LinearLayout
  22.             android:id="@+id/topLL"
  23.             android:layout_width="fill_parent"
  24.             android:layout_height="wrap_content"
  25.             android:orientation="horizontal" >

  26.             <LinearLayout
  27.                 android:id="@+id/linearLayout1"
  28.                 android:layout_width="fill_parent"
  29.                 android:layout_height="fill_parent"
  30.                 android:layout_weight="3.0"
  31.                 android:gravity="center"
  32.                 android:orientation="vertical" >

  33.                 <TextView
  34.                     android:id="@+id/tvTime"
  35.                     android:layout_width="wrap_content"
  36.                     android:layout_height="wrap_content"
  37.                     android:layout_marginTop="-2.0dip"
  38.                     android:textColor="@color/white_color"
  39.                     android:textSize="48.0dip" />

  40.                 <TextView
  41.                     android:id="@+id/tvDay"
  42.                     android:layout_width="fill_parent"
  43.                     android:layout_height="wrap_content"
  44.                     android:layout_marginLeft="10.0dip"
  45.                     android:textColor="@color/default_text_color"
  46.                     android:textSize="12.0dip" />

  47.                 <TextView
  48.                     android:id="@+id/tvWeek"
  49.                     android:layout_width="fill_parent"
  50.                     android:layout_height="wrap_content"
  51.                     android:layout_marginLeft="10.0dip"
  52.                     android:textColor="@color/dark_blue_color"
  53.                     android:textSize="12.0dip"
  54.                     android:visibility="gone" />
  55.             </LinearLayout>

  56.             <RelativeLayout
  57.                 android:id="@+id/widgetRL"
  58.                 android:layout_width="fill_parent"
  59.                 android:layout_height="fill_parent"
  60.                 android:layout_weight="3.0" >

  61.                 <TextView
  62.                     android:id="@+id/cityTV"
  63.                     android:layout_width="wrap_content"
  64.                     android:layout_height="wrap_content"
  65.                     android:layout_alignParentRight="true"
  66.                     android:layout_alignParentTop="true"
  67.                     android:layout_marginRight="3.0dip"
  68.                     android:layout_marginTop="3.0dip"
  69.                     android:drawableRight="@drawable/ic_next"
  70.                     android:textColor="@color/white_color"
  71.                     android:textSize="18.0dip"
  72.                     android:textStyle="bold" />

  73.                 <ImageView
  74.                     android:id="@+id/todayImg"
  75.                     android:layout_width="54.0dip"
  76.                     android:layout_height="54.0dip"
  77.                     android:layout_alignParentTop="true"
  78.                     android:layout_marginLeft="5.0dip"
  79.                     android:layout_marginTop="5.0dip"
  80.                     android:padding="4.0dip"
  81.                     android:src="@drawable/day0" />

  82.                 <TextView
  83.                     android:id="@+id/todayTempNow"
  84.                     android:layout_width="wrap_content"
  85.                     android:layout_height="wrap_content"
  86.                     android:layout_alignParentRight="true"
  87.                     android:layout_below="@id/cityTV"
  88.                     android:layout_marginRight="5.0dip"
  89.                     android:layout_marginTop="-2.0dip"
  90.                     android:gravity="center"
  91.                     android:paddingRight="8.0dip"
  92.                     android:textColor="@color/white_color"
  93.                     android:textSize="28.0dip" />

  94.                 <TextView
  95.                     android:id="@+id/todayTemp"
  96.                     android:layout_width="wrap_content"
  97.                     android:layout_height="wrap_content"
  98.                     android:layout_alignParentRight="true"
  99.                     android:layout_below="@id/todayImg"
  100.                     android:layout_marginTop="3.0dip"
  101.                     android:paddingRight="8.0dip"
  102.                     android:textColor="@color/default_text_color"
  103.                     android:textSize="12.0dip" />

  104.                 <TextView
  105.                     android:id="@+id/todayDesc"
  106.                     android:layout_width="wrap_content"
  107.                     android:layout_height="wrap_content"
  108.                     android:layout_alignLeft="@id/todayImg"
  109.                     android:layout_below="@id/todayImg"
  110.                     android:layout_marginTop="3.0dip"
  111.                     android:paddingLeft="4.0dip"
  112.                     android:textColor="@color/default_text_color"
  113.                     android:textSize="12.0dip" />

  114.                 <TextView
  115.                     android:id="@+id/todayWet"
  116.                     android:layout_width="wrap_content"
  117.                     android:layout_height="wrap_content"
  118.                     android:layout_alignLeft="@id/todayImg"
  119.                     android:layout_below="@id/todayDesc"
  120.                     android:paddingLeft="4.0dip"
  121.                     android:textColor="@color/dark_blue_color"
  122.                     android:textSize="12.0dip"
  123.                     android:visibility="gone" />

  124.                 <TextView
  125.                     android:id="@+id/todayWind"
  126.                     android:layout_width="wrap_content"
  127.                     android:layout_height="wrap_content"
  128.                     android:layout_alignParentRight="true"
  129.                     android:layout_below="@id/todayTemp"
  130.                     android:paddingRight="8.0dip"
  131.                     android:textColor="@color/dark_blue_color"
  132.                     android:textSize="12.0dip"
  133.                     android:visibility="gone" />
  134.             </RelativeLayout>
  135.         </LinearLayout>
  136.     </RelativeLayout>

  137. </LinearLayout>
复制代码

这一讲的最后,我们说一个大家都比较关心的知识点:PM2.5,这个功能彩虹天气以前是有的,不过最近一直都刷不出来数据,估计是他抓的数据源出问题了吧。

大家如果有PM2.5开发需求的,我给大家推荐一个比较好的数据源:PM25.in

大家开发的时候可以使用他提供的测试appKey:
公共测试AppKey:5j1znBVAsnSf5xQyNQyq这个网站的所有的appKey都是有访问次数限制的,所以这个公共的appKey经常获取不到数据,估计是很多人在用,我这里先把我申请的appKey贡献出来,大家都省着点用
我申请的AppKey: YZGfRKfjgzJE78xFEjxg
我们可以到pm25.in的网站上看一下他提供的接口,每个接口需要上传的请求参数都很详细的列出来了,返回的数据都是Json格式的,这个对我们码农来说用起来就非常方便了,我用了我之前介绍的http://loopj.com/android-async-http/这个开源library项目来实现的这个功能:
  1.                 RequestParams params = new RequestParams();
  2.                 DBHelper dbHelper = new DBHelper(context, "db_weather.db");
  3.                 params.put("city", dbHelper.getCityNameByCode(cityCode));
  4.                 params.put("token", "YZGfRKfjgzJE78xFEjxg");
  5.                 
  6.                 AsyncHttpClient client = new AsyncHttpClient();
  7.                 client.get("http://www.pm25.in/api/querys/aqi_details.json", params, new JsonHttpResponseHandler() {
  8.                         @Override
  9.                         public void onStart() {
  10.                                 super.onStart();
  11.                                 // 开始的回调
  12.                         }
  13.                         @Override
  14.                         public void onSuccess(JSONObject response) {
  15.                                 // 成功后的回调
  16.                                 try {
  17.                                         aqiMsgTV.setText("PM2.5:"+response.getString("pm2_5_24h")); // 这个就是pm2.5的数据
  18.                                 } catch (Exception e) {
  19.                                         e.printStackTrace();
  20.                                 }
  21.                                 super.onSuccess(response);
  22.                         }
  23.                         @Override
  24.                         public void onFailure(Throwable error) {
  25.                                 super.onFailure(error);
  26.                                 // 失败后的回调
  27.                         }
  28.                 });
复制代码

这个pm25的接口有个问题:就是每个小时的访问次数次数都有限制,其实这也很好解决的,我们只需要在服务器上做个缓存,再开个定时任务去pm25.in取数据就好了。不过昨天在巴士的版主群里问了一下,发现很多人都没有做过服务端的东西,我怕我写了个服务端的东西大家都看不懂,所以我就把这个PM25的功能做成了本地版的了,不过这样做自己玩玩也还行。



这一篇征文就写到这,下一篇我会介绍一下彩虹天气的菜单功能。
本主题由 System 于 2014-1-14 18:00 解除限时高亮
0 0
原创粉丝点击