天气项目·桌面小组件

整体介绍:

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

天气项目·桌面小组件_第1张图片

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

天气项目·桌面小组件_第2张图片
桌面组件的页面布局

(二)weather_widget_provider.xml

1.新建xml文件夹

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

天气项目·桌面小组件_第3张图片
第一步
天气项目·桌面小组件_第4张图片
第二步

2.新建weather_widget_provider.xml布局文件

天气项目·桌面小组件_第5张图片
新建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中配置监听响应者


天气项目·桌面小组件_第6张图片
结构目录

你可能感兴趣的:(天气项目·桌面小组件)