美文网首页
天气项目·桌面小组件

天气项目·桌面小组件

作者: _人间客 | 来源:发表于2016-07-27 18:27 被阅读252次

    整体介绍:

    Android桌面小控件称为Widget,通过AppWidgetProvider类提供,AppWidgetProvider是widget的提供者。 AppWidgetProvider继承自Android四大组件之一的BroadcastReceive。

    (一)四大组件:

    Activity

    BroadcastReceive:注册后会观察某一事件的发生,若发生,就会触发规定的操作。

    service:Android中可以视为没有界面的activity,在Android系统的后台执行,应用启动服务后,应用关闭,如果服务没有停止,则服务方法会一直Android后台执行

    ApplicationContext:app的上下文,用于存储一些公共变量等。

     (二)步骤

    在AppWidgetProvider写相应的方法去控制小部件的显示

    1.创建AppWidgetProvider的子类(WeatherWidgetProvider.java)

    2.在res文件夹下创建xml文件夹,文件夹中创建weather_widget_provider.xml

    3.写一个布局文件用来展示widget控件(weather_widget_layout.xml)

    4.到weather_widg_provider.xml配置布局文件和widget小部件尺寸

    5.到Mainifest.xml中配置监听响应者


    一、页面

    (一)weather_widget_layout.xml

    Ctrl+N新建布局文件weather_widget_layout.xml

    RelativeLayout布局,widget_city_tv用toRightOf和alignBottom定位,widget_weather_tv用layout_below定位。

    桌面组件的页面布局

    (二)weather_widget_provider.xml

    1.新建xml文件夹

    选中res文件夹,Ctrl+N,新建一个Folder

    第一步 第二步

    2.新建weather_widget_provider.xml布局文件

    新建xml文件

    Ctrl+N,选择Android XMLFile。限定部件在桌面的尺寸,以及刷新时间(毫秒)

    android:minWidth="120dp"

    android:minHeight="60dp"

    android:updatePeriodMillis="1000"

    尺寸:如果小部件的尺寸不足以显示小部件布局,生成的小部件会出现加载错误的提示,这时要扩大小部件的尺寸。

    刷新时间:widget小部件的数据是定时刷新的,在xml文件夹的widget_provider.xml中配置的android:updatePeriodMillis="1000"是无效的,因为Android系统的刷新时间是半小时以上。可以自己注册service去后台执行,在service中添加一个定时器对象,通过定时器设置刷新时间,这样可以灵活处理小部件的刷新任务(见WeatherWidgetService.java)

    二、WeatherWidgetProvider.java


    public class WeatherWidgetProvider extends AppWidgetProvider。以下方法均为”Ctrl+/”提示构建。@Override代表词方法为系统调用,我们只需要去实现。

    (一)public void onEnabled(Context context)

    context.startService(new Intent(context, WeatherWidgetService.class));//启动Service

    当桌面小控件第一次加载时,调用的方法。

    (二)public void onDeleted(Context context, int[] appWidgetIds)

    context.stopService(new Intent(context, WeatherWidgetService.class));//停止service

    当桌面小控件全部被删除时,系统调用的方法

    (三)public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)

    桌面小控件的刷新方法,一般不用。

    三、WeatherWidgetService.java

    引入的包:

    import android.text.TextUtils;//创建方法时CTRL+1引入

    import android.widget.RemoteViews;//创建方法时CTRL+1引入

    import com.cxy.weather.WeatherBean;//手动引入

    介绍:

    Android的四大组件之一service: 在Android系统后台(与后台线程不同)执行一些操作,如音乐后台播放,某些数据的网络同步 可以把service视为一个没有界面的activity。

    服务的启动有两种方式:

    1.通过Context.bindService();* 要求服务与开启服务的应用同生共死:如果应用关闭了,通过Context.bindService()开启的服务也会关闭,会回调 onBind(Intent intent)

    2.Context.startService();不要求服务与应用同生共死,两者生命没有必然联系。可回调onCreate()

    (一)变量

    private Timer timer;// 定时器

    private TimerTask timerTast

    (二)private TimerTask timerTast = new TimerTask()

    1.public void run()

    getWeatherDateFromNetWork();

    2.private void getWeatherDateFromNetWork()

    获取网络资源,先建立网络连接的路径,申请可变字符串StringBuffer,用于保存网络请求的结果

    String urlString = "http://weather.123.duba.net/static/weather_info/0.html";//给网址,0代表本地,101010100代表北京,还可以加成+“cityCode”+

    StringBuffer stringBuffer = new StringBuffer();

    try { String resultString = NetWorkUtils.doGet(urlString);// 新建NetWorkUtils类,将代码封装成其中的一个方法

    if (TextUtils.isEmpty(resultString)) { // 异常处理 当resultString为空

    return;}

     netWorkErrorTextView.setText("网络异常,请刷新")。UI操作只能是由UI线程完成,后台禁止调用任何UI相关操作,如果后台线程需要UI界面刷新数据,是通过通知主线程去刷新数据来实现的。 即:后台数据不准做UI。

    if (!resultString.contains("weather_callback")) { // 确定请求道的数据包含天气信息。

    return;

    }// 通过解析字符串来把请求到的数据转化为JSON数据

    // String resultJsonString =

    // WeatherBean.dealWithResultString(resultString);//将代码封装成weatherBean中的一个方法

    // JSONObject jsonObject = new JSONObject(resultJsonString); //

    // 通过JSON字符串创建JSONObject的对象

    // JSONObject weatherJsonObject = jsonObject

    // .getJSONObject("weatherinfo");//

    // 从JSONObject中取出weatherinfo的JSON对象

    WeatherBean weatherBean = new WeatherBean(resultString);

    System.out.println(weatherBean);

    getWeatherDateSuccess(weatherBean);

    } catch (Exception e) { // 异常捕获 建议把catch中的异常放大到所有异常

    e.printStackTrace();

    }

    }

    3.private void getWeatherDateSuccess(WeatherBean weatherBean)

    (三)private Handler netWorkFinishHandler = new Handler()

    1.public void handleMessage(Message msg)

    (四)public IBinder onBind(Intent intent)

    (五)public void onCreate()

    四、在Manifest中配置监听响应者

    结构目录

    相关文章

      网友评论

          本文标题:天气项目·桌面小组件

          本文链接:https://www.haomeiwen.com/subject/wjbojttx.html