自定义天气显示小组件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



你可能感兴趣的:(自定义天气显示小组件Widget)