自定義天氣顯示小組件Widget

這次採用高德地圖提供的SDK來獲取天氣情況,並顯示在桌面小組件上,首先要註冊高德地圖api KEY,高德開發平臺官網的開發文檔有詳細介紹。這裏講一下如何獲取SHA1值,借(fu)鑑(zhi)網上大神寫的方法,直接Log打印出來即可

public String sHA1(Context context) {
    try {
        PackageInfo info = context.getPackageManager().getPackageInfo(
                context.getPackageName(), PackageManager.GET_SIGNATURES);
        byte[] cert = info.signatures[0].toByteArray();
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] publicKey = md.digest(cert);
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < publicKey.length; i++) {
            String appendString = Integer.toHexString(0xFF & publicKey[i])
                    .toUpperCase(Locale.US);
            if (appendString.length() == 1)
                hexString.append("0");
            hexString.append(appendString);
            hexString.append(":");
        }
        String result = hexString.toString();
        return result.substring(0, result.length()-1);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

利用android studio新建 Widget小組件很方便,new 一個appWidget,android studio 自動幫你創建widget的layout,config信息,繼承自AppWidgetProvider的類,已經註冊好相應的Manifest信息,此時小組件已經可以在桌面上顯示了。試試看吧。

config信息 widget_info.xml 如下:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/weather_widget"           對應的widget的界面
    android:initialKeyguardLayout="@layout/weather_widget"
    android:updatePeriodMillis="8640000"                      刷新時間,android最低刷新時間爲3分鐘,一般可以設置大一點
    android:previewImage="@drawable/example_appwidget_preview"  在手機小組件顯示的圖標,可以把自己喜歡的圖片放進去
    android:widgetCategory="home_screen|keyguard"              小組件的類別
    android:minHeight="40dp"                                   最小高度
    android:minWidth="110dp">                                  最小高度

</appwidget-provider>

WeatherWidger.class 繼承自  AppWidgetProvider 主要方法有                                                                                                   
public class WeatherWidget extends AppWidgetProvider{
   @Override
    public void onEnabled(Context context) {   //第一次添加小組件時調用的方法
        super.onEnabled(context);

        Intent intent = new Intent(context,WeatherService.class);   
        context.startService(intent);                                   //開啓獲取天氣的服務
    }

    @Override
    public void onDisabled(Context context) {    //最後一個小組件被移除時調用的方法
        super.onDisabled(context);

        Intent intent = new Intent(context,WeatherService.class);
        context.stopService(intent);                                   //關閉服務
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {    //更新小組件,這裏我們用服務更新小組件,所以該方法不用添加代碼
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }
}
 
新建一個處理天氣並更新widget的Service類 WeatherService 繼承自Service ,先去Manifest註冊一下Service
public class WeatherService extends Service implements WeatherSearch.OnWeatherSearchListener{

    private String cityName = "廣州";   //想要查詢的城市名稱

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        initWeather();
    }

    //初始化天氣
    private void initWeather(){
        WeatherSearchQuery weatherSearchQuery = new WeatherSearchQuery(cityName,     //查詢條件
                WeatherSearchQuery.WEATHER_TYPE_LIVE);
        WeatherSearch weatherSearch = new WeatherSearch(WeatherService.this);
        weatherSearch.setQuery(weatherSearchQuery);                                 //設置查詢條件
        weatherSearch.setOnWeatherSearchListener(this);                            //綁定監聽
        weatherSearch.searchWeatherAsyn();                                         //查詢天氣情況的異步接口
    }

    //更新widget 這裏主要用的是RemoteViews類和AppWidgetManager
    public void updateView(String result){
        RemoteViews rv = new RemoteViews(getPackageName(),R.layout.weather_widget);   //綁定widget的顯示界面
        rv.setTextViewText(R.id.widget_tv_content, result);                           //設置widget的文字
        AppWidgetManager manager =AppWidgetManager.getInstance(WeatherService.this);    //初始化AppWidgetManager
        ComponentName cn = new ComponentName(getApplication(),WeatherWidget.class);
        manager.updateAppWidget(cn,rv);                                                  //更新UI
    }

    //獲取天氣的情況
    @Override
    public void onWeatherLiveSearched(LocalWeatherLiveResult localWeatherLiveResult, int rCode) {
        if (rCode == 1000){ //如果獲取天氣成功
            LocalWeatherLive weatherLive = localWeatherLiveResult.getLiveResult();  //天氣情況的一個封裝類
            String city = weatherLive.getCity();                                    //獲取當前城市
            String weather = weatherLive.getWeather();                               //獲取天氣,晴天,多雲等
            String temp = weatherLive.getTemperature();                              //獲取溫度,只是數字,自己後面加單位
            String reportTime = weatherLive.getReportTime();                        //獲取天氣更新的時間

            StringBuffer sb = new StringBuffer();
            sb.append(city).append("\n").append(weather).append("\n").append(temp).append("°C\n").append(reportTime).append("\n");
            updateView(sb.toString());     //更新widget UI
        }
    }

    @Override
    public void onWeatherForecastSearched(LocalWeatherForecastResult localWeatherForecastResult, int i) {

    }
}
查詢天氣用的是高德的搜索服務 AMapSearch SDK 下載地址 http://lbs.amap.com/api/android-sdk/download
最後,若以上有出錯或者其他的,懇請指出,加以改正,希望一起學習一起進步。
best wish
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章