整体介绍:
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布局文件
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();
}
}