安卓实例教程天气预报实例有木有

Android 3.0自带的天气预报例子代码_小组_ThinkSAAS
Android 3.0自带的天气预报例子代码
Android 3.0自带的天气预报例子代码
Android 3.0正式版API Level 11中加入了一个天气预报例子,下面是manifest.xml中的关键代码,只是少了xml的编码头:
&manifest xmlns:android="/apk/res/android"
package="com.example.android.weatherlistwidget"&
&uses-sdk android:minSdkVersion="11"/&
&application android:label="Weather Widget Sample"&
&receiver android:name="WeatherWidgetProvider"&
&intent-filter&
&action android:name="android.appwidget.action.APPWIDGET_UPDATE"/&
&/intent-filter&
&meta-data android:name="android.appwidget.provider"
android:resource="@xml/widgetinfo"/&
&/receiver&
&service android:name="WeatherWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="false"/&
&provider android:name="WeatherDataProvider"
android:authorities="com.example.android.weatherlistwidget.provider"/&
&/application&
&/manifest&
这里WeatherDataProvider.java的源码为主要是ContentProvider相关的处理,这里作为appWidget的receiver
class WeatherDataPoint {
WeatherDataPoint(String c, int d) {
public class WeatherDataProvider extends ContentProvider {
public static final Uri CONTENT_URI =
Uri.parse("content://com.example.android.weatherlistwidget.provider");
public static class Columns {
public static final String ID ="_id";
public static final String CITY ="city";
public static final String TEMPERATURE ="temperature";
private static final ArrayList&WeatherDataPoint& sData = new ArrayList&WeatherDataPoint&();
public boolean onCreate() {
sData.add(new WeatherDataPoint("San Francisco", 13));
sData.add(new WeatherDataPoint("New York", 1));
sData.add(new WeatherDataPoint("Seattle", 7));
sData.add(new WeatherDataPoint("Boston", 4));
sData.add(new WeatherDataPoint("Miami", 22));
sData.add(new WeatherDataPoint("Toronto", -10));
sData.add(new WeatherDataPoint("Calgary", -13));
sData.add(new WeatherDataPoint("Tokyo",);
sData.add(new WeatherDataPoint("Kyoto", 11));
sData.add(new WeatherDataPoint("London", -1));
sData.add(new WeatherDataPoint("Nomanisan", 27));
public synchronized Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
assert(uri.getPathSegments().isEmpty());
final MatrixCursor c = new MatrixCursor(
new String[]{ Columns.ID, Columns.CITY, Columns.TEMPERATURE });
for (int i = 0; i & sData.size(); ++i) {
final WeatherDataPoint data = sData.get(i);
c.addRow(new Object[]{ new Integer(i), data.city, new Integer(data.degrees) });
public String getType(Uri uri) {
return"vnd.android.cursor.dir/vnd.weatherlistwidget.citytemperature";
public Uri insert(Uri uri, ContentValues values) {
public int delete(Uri uri, String selection, String[] selectionArgs) {
public synchronized int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
assert(uri.getPathSegments().size() == 1);
final int index = Integer.parseInt(uri.getPathSegments().get(0));
final MatrixCursor c = new MatrixCursor(
new String[]{ Columns.ID, Columns.CITY, Columns.TEMPERATURE });
assert(0 &= index && index & sData.size());
final WeatherDataPoint data = sData.get(index);
data.degrees = values.getAsInteger(Columns.TEMPERATURE);
getContext().getContentResolver().notifyChange(uri, null);
上面可以看到,对于插入和删除没有做过多的处理,对于天气更新给出了详细的解决方法。
有关 WeatherWidgetProvider.java 主要是appWidget的核心,为provider
class WeatherDataProviderObserver extends ContentObserver { //监控数据库的变化
private AppWidgetManager mAppWidgetM
private ComponentName mComponentN
WeatherDataProviderObserver(AppWidgetManager mgr, ComponentName cn, Handler h) {
mAppWidgetManager =
mComponentName =
public void onChange(boolean selfChange) {
mAppWidgetManager.notifyAppWidgetViewDataChanged(
mAppWidgetManager.getAppWidgetIds(mComponentName), R.id.weather_list);
public class WeatherWidgetProvider extends AppWidgetProvider {
public static String CLICK_ACTION ="com.example.android.weatherlistwidget.CLICK";
public static String REFRESH_ACTION ="com.example.android.weatherlistwidget.REFRESH";
public static String EXTRA_CITY_ID ="com.example.android.weatherlistwidget.city";
private static HandlerThread sWorkerT
private static Handler sWorkerQ
private static WeatherDataProviderObserver sDataO
public WeatherWidgetProvider() {
sWorkerThread = new HandlerThread("WeatherWidgetProvider-worker"); //开一个线程,这里用到了HandlerThread
sWorkerThread.start();
sWorkerQueue = new Handler(sWorkerThread.getLooper()); //不了解Thread的Looper可以看下这个例子比较简单清晰
public void onEnabled(Context context) { //当appWidget添加到桌面上时
final ContentResolver r = context.getContentResolver();
if (sDataObserver == null) {
final AppWidgetManager mgr = AppWidgetManager.getInstance(context);
final ComponentName cn = new ComponentName(context, WeatherWidgetProvider.class);
sDataObserver = new WeatherDataProviderObserver(mgr, cn, sWorkerQueue);
r.registerContentObserver(WeatherDataProvider.CONTENT_URI, true, sDataObserver); //注册监控数据库变化的回调
public void onReceive(Context ctx, Intent intent) {
final String action = intent.getAction();
if (action.equals(REFRESH_ACTION)) { //接收数据库改变的回调广播
final Context context =
sWorkerQueue.removeMessages(0);
sWorkerQueue.post(new Runnable() {
public void run() {
final ContentResolver r = context.getContentResolver();
final Cursor c = r.query(WeatherDataProvider.CONTENT_URI, null, null, null,
final int count = c.getCount();
final int maxDegrees = 96;
r.unregisterContentObserver(sDataObserver); //首先取消数据库监控
for (int i = 0; i & ++i) {
final Uri uri = ContentUris.withAppendedId(WeatherDataProvider.CONTENT_URI, i);
final ContentValues values = new ContentValues();
values.put(WeatherDataProvider.Columns.TEMPERATURE,
new Random().nextInt(maxDegrees));
r.update(uri, values, null, null); //更新数据库记录层
r.registerContentObserver(WeatherDataProvider.CONTENT_URI, true, sDataObserver); //重新设置监视数据库
final AppWidgetManager mgr = AppWidgetManager.getInstance(context);
final ComponentName cn = new ComponentName(context, WeatherWidgetProvider.class);
mgr.notifyAppWidgetViewDataChanged(mgr.getAppWidgetIds(cn), R.id.weather_list); //提示Widget有数据更新并刷新UI
} else if (action.equals(CLICK_ACTION)) {
final int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
final String city = intent.getStringExtra(EXTRA_CITY_ID);
final String formatStr = ctx.getResources().getString(R.string.toast_format_string);
Toast.makeText(ctx, String.format(formatStr, city), Toast.LENGTH_SHORT).show();
super.onReceive(ctx, intent);
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int i = 0; i & appWidgetIds. ++i) {
final Intent intent = new Intent(context, WeatherWidgetService.class);
//当桌面上有多个这个相同的appWidget需要分别处理
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
final RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
rv.setRemoteAdapter(appWidgetIds[i], R.id.weather_list, intent);
rv.setEmptyView(R.id.weather_list, R.id.empty_view);
final Intent onClickIntent = new Intent(context, WeatherWidgetProvider.class);
onClickIntent.setAction(WeatherWidgetProvider.CLICK_ACTION);
onClickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
onClickIntent.setData(Uri.parse(onClickIntent.toUri(Intent.URI_INTENT_SCHEME)));
final PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(context, 0,
onClickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.weather_list, onClickPendingIntent);
final Intent refreshIntent = new Intent(context, WeatherWidgetProvider.class);
refreshIntent.setAction(WeatherWidgetProvider.REFRESH_ACTION);
final PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(context, 0,
refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.refresh, refreshPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
super.onUpdate(context, appWidgetManager, appWidgetIds);
对于WeatherWidgetService.java这个Service集成于RemoteViewsService,主要是UI上的处理
public class WeatherWidgetService extends RemoteViewsService {
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mC
private Cursor mC
private int mAppWidgetId;
public StackRemoteViewsFactory(Context context, Intent intent) {
mContext =
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
public void onCreate() {
public void onDestroy() {
if (mCursor != null) {
mCursor.close();
public int getCount() {
return mCursor.getCount();
public RemoteViews getViewAt(int position) {
String city ="Unknown City";
int temp = 0;
if (mCursor.moveToPosition(position)) {
final int cityColIndex = mCursor.getColumnIndex(WeatherDataProvider.Columns.CITY);
final int tempColIndex = mCursor.getColumnIndex(
WeatherDataProvider.Columns.TEMPERATURE);
city = mCursor.getString(cityColIndex);
temp = mCursor.getInt(tempColIndex);
final String formatStr = mContext.getResources().getString(R.string.item_format_string);
final int itemId = (position % 2 == 0 ? R.layout.light_widget_item
: R.layout.dark_widget_item);
RemoteViews rv = new RemoteViews(mContext.getPackageName(), itemId);
rv.setTextViewText(R.id.widget_item, String.format(formatStr, temp, city));
final Intent fillInIntent = new Intent();
final Bundle extras = new Bundle();
extras.putString(WeatherWidgetProvider.EXTRA_CITY_ID, city);
fillInIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
public RemoteViews getLoadingView() {
public int getViewTypeCount() {
public long getItemId(int position) {
public boolean hasStableIds() {
public void onDataSetChanged() {
if (mCursor != null) {
mCursor.close();
mCursor = mContext.getContentResolver().query(WeatherDataProvider.CONTENT_URI, null, null,
null, null);
用户评论(0)
喜欢这个帖子的用户
加载中......
开发技术学习小组列表
PHP开发框架
缓存Memcache
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
手机客户端
ThinkSAAS接收任何功能的Iphone(IOS)和Android手机的客户端定制开发服务
让ThinkSAAS更好,把建议拿来。android学习资料:自带的天气预报例子代码_中华文本库
第1页/共4页
文本预览:
Android 3.0自带的天气预报例子代码 Android 3.0正式版API Level 11中加入了一个天气预报例子,下面是manifest.xml中的关键代码,只是少了 xml的编码头: XML/HTML代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
这里WeatherDataProvider.Java的源码为主要是ContentProvider相关的处理,这里作为appWidget的receiver Java代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. classWeatherDataPoint{ S//城市//度数 WeatherDataPoint(Stringc,intd){ city=c; degrees=d; } } publicclassWeatherDataProviderextendsContentProvider{ publicstaticfinalUriCONTENT_URI= Uri.parse("content://com.example.android.weatherlistwidget.provider"); publicstaticclassColumns{ publicstaticfinalStringID="_id"; publicstaticfinalStringCITY="city"; publicstaticfinalStringTEMPERATURE="temperature"; } privatestaticfinalArrayListsData=newArrayList(); @Override publicbooleanonCreate(){ sData.add(newWeatherDataPoint("SanFrancisco"13)); sData.add(newWeatherDataPoint("NewYork"1)); sData.add(newWeatherDataPoint("Seattle"7)); sData.add(newWeatherDataPoint("Boston"4)); sData.add(newWeatherDataPoint("Miami"22)); sData.add(newWeatherDataPoint("Toronto"-10)); sData.add(newWeatherDataPoint("Calgary"-13)); sData.add(newWeatherDataPoint("Tokyo"8)); sData.add(newWeatherDataPoint("Kyoto"11)); sData.add(newWeatherDataPoint("London"-1)); sData.add(newWeatherDataPoint("Nomanisan"27)); } @Override publicsynchronizedCursorquery(Uriuri,String[]projection,Stringselection, String[]selectionArgs,StringsortOrder){ assert(uri.getPathSegments().isEmpty()); finalMatrixCursorc=newMatrixCursor( newString[]{Columns.ID,Columns.CITY,Columns.TEMPERATURE}); for(inti=0;i<sData.size();++i){ finalWeatherDataPointdata=sData.get(i); c.addRow(newObject[]{newInteger(i),data.city,newInteger(data.degrees)}); } } @Override publicStringgetType(Uriuri){ return"vnd.android.cursor.dir/vnd.weatherlistwidget.citytemperature"; } @Override publicUriinsert
第1页/共4页
寻找更多 ""weizhulin 的BLOG
用户名:weizhulin
文章数:64
评论数:212
访问量:1375402
注册日期:
阅读量:6688
51CTO推荐博文
1698人学习
今天这个程序的功能是天气预报查询.首先看一下效果图:
    初始化界面.  &
&                              查询结果
这个原创是来自,我觉得是一个不错的例子,数据是通过Google Weather api获取的,例如我们在浏览器里输入以下::得到结果是XML数据(查询不同的地方只要把=号后面换成你想要的城市名就OK了,好像不支持中文,只支持拼音).如下图所示:
我们用SAXParser.解析获取的数据.当然这一步是重点,好了不多说了,如果想看详细的话.请点击以下链接:
不过此教程的源代码有问题,运行不起来,我修改了一下,还有让其支持中文查询,如果大家,需要源码的话,请留下你们的Email,我会尽快,发给你们.thx~
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
16:04:53 09:56:47 14:24:44 14:24:24 14:54:50 18:10:20 20:05:58 22:37:31 14:42:01 17:48:48 16:13:16 13:11:16 11:52:49 14:51:24 16:12:53 &&1&
&&页数 ( 1/6 ) &Android调用天气预报的WebService简单例子28
上亿文档资料,等你来发现
Android调用天气预报的WebService简单例子28
Android调用天气预报的WebService;http://express.ruanko.co;一、获取并使用KSOAP包;在AndroidSDK中并没有提供调用WebSe;我下载的最新的是:ksoap2-android-;我在使用ksoap2-android时犯了一个低;当时分析这个问题时一直以为是Eclipse出了问;实际是我下载的ksoap2-an
 Android调用天气预报的WebService简单例子
下面例子改自网上例子:/ruanko-express_34/technologyexchange5.html 不过网上这个例子有些没有说明,有些情况不一样了,所以我重新写了。一、获取并使用KSOAP包在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WebService库非常丰富,但这些对Android来说过于庞大。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。 KSOAP2 地址:/p/ksoap2-android/我下载的最新的是: ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar 注意:我在使用ksoap2-android时犯了一个低级错误:使用时报错误:The import org.ksoap2 cannot be resolved。当时分析这个问题时一直以为是Eclipse出了问题,找了好多方法都不行,实际是我下载的ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar文件是错误的导致的,走了弯路。在 /p/ksoap2-android/wiki/HowToUse?tm=2 页面 通过鼠标右键链接另存为存的是同名的一个纯文本的Html文件。而不是我们想要的。我是在/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.4/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar 点 View raw file 才正确下载对应文件的。 选择我们的项目,右键菜单中 Build Path C& Add External Archives… 增加这个下载的包 增加好后,我们在选择我们的项目,右键菜单中 Build Path C& Configure Build Path 的 Libraries 中可以看到下面图: 二,分以下几步来调用 WebService1、指定 WebService 的命名空间和调用方法import org.ksoap2.serialization.SoapOprivate static final String NAMESPACE = &.cn/&; private static final String METHOD_NAME = &getWeatherbyCityName&;SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。2、设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下: rpc.addProperty(&theCityName&, &北京&);要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。3、生成调用Webservice方法的SOAP请求信息。SoapSerializationEnvelope envelope = newSoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut =envelope.dotNet =envelope.setOutputSoapObject(rpc);创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。该版本号需要根据服务端WebService的版本号设置。在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的SoapObject对象。4、创建HttpTransportsSE对象。这里不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL); 这是一个要过期的类private static String URL =&.cn/webservices/weatherwebservice.asmx&; HttpTransportSE ht = new HttpTransportSE(URL);ht.debug =5、使用call方法调用WebService方法private static String SOAP_ACTION =&.cn/getWeatherbyCityName&;ht.call(SOAP_ACTION, envelope);网上有人说这里的call的第一个参数为null,但是经过我的测试,null是不行的。
第2个参数就是在第3步创建的SoapSerializationEnvelope对象。6、获得WebService方法的返回结果有两种方法:1、使用getResponse方法获得返回数据。private SoapOdetail =(SoapObject) envelope.getResponse();2、使用 bodyIn 及 getProperty。private SoapOSoapObject result = (SoapObject)envelope.bodyIn;detail = (SoapObject)result.getProperty(&getWeatherbyCityNameResult&);7、 这时候执行会出错,提示没有权限访问网络需要修改 AndroidManifest.xml 文件,赋予相应权限简单来说就是增加下面这行配置:&uses-permissionandroid:name=&android.permission.INTERNET&&&/uses-permission&完整的 AndroidManifest.xml 文件 如下:注:Android 中在代码中为了调试写了system.out.print()输出项在菜单:Window--&show view--&other--&找到Android,选择Logcat 是可以看到输出的,
如果你想在一个单独的窗口看到system.out.print()的输出的话,可以在logcat界面点那个绿色的“+”好,在Filter name 和 By log tag里面均填入System.out,这样的话你就能在单独的界面查看system.out.print()的输出了!!&?xml version=&1.0& encoding=&utf-8&?&&manifest xmlns:android=&/apk/res/android& &/manifest&完整的代码如下: package=&ghj1976.MyWeather& android:versionCode=&1& android:versionName=&1.0&& &application android:icon=&@drawable/icon&
&activity android:name=&.MyWeatherActivity&
&intent-filter&
&action &category android:label=&@string/app_name&& android:label=&@string/app_name&& android:name=&android.intent.action.MAIN& /& android:name=&android.intent.category.LAUNCHER& /& &/intent-filter& &/activity& &/application& &uses-permission android:name=&android.permission.INTERNET&&&/uses-permission&package ghj1976.MyW import java.io.UnsupportedEncodingE 包含各类专业文献、行业资料、幼儿教育、小学教育、中学教育、生活休闲娱乐、外语学习资料、各类资格考试、高等教育、文学作品欣赏、Android调用天气预报的WebService简单例子28等内容。 
  【】 
您可在本站搜索以下内容:
  用C#写的winform调用webservice天气预报小软件教程_IT/计算机_专业资料。用C#写... winform引用webservice 1页 2下载券 Android调用天气预报的W... 7页 1下载...
  textBox1s.Text = s[1q]; } } 输入完代码以后,运行, Ok,这个实例就完成... winform中对webservice的... 4页 免费 Android调用天气预报的W... 7页 1...
s  android如何调用webservice示例_IT/计算机_专业资料... 搞笑图片乐翻人 cs3简单制作动态搞笑图片... Android调用天气预报的W... 8页 免费 Android访问...
s  Android 调用天气预报的 WebService 简单例子新建一个 android 的项目,构建项目的类库,将 ksoap2-android-assembly-2.s.4-jar-with-dependencies.jar 添加到类库...
  android之调用webservice 实现图片上传_计算机软件及应用_IT/计算机_专业资料。... Android调用WebService 4页 免费 Android调用天气预报的W... 8页 免费 ...
  android天气预报报告_工学_高等教育_教育专区。这是一个简单的android天气预报...2. 数据获取模块 天气数据是从 Google 提供的 Web Service 中获取的,调试 ...
  Android 3.0自带的天气预报例子代码_计算机软件及...Thread 的 Looper 可以看下这个例子比较简单清晰 ??... 对于 WeatherWidgetService.java 这个 Service 集成...
  Android获取新浪天气预报数据实例_计算机软件及应用_IT/计算机_专业资料。Android 获取新浪天气预报数据实例 新浪天气预报地址: http://php..cn/...
  Android配合WebService访问远程数据库_IT/计算机_专业资料。android访问远程Web... //需要调用的方法名(获得本天气预报 Web Services 支持的城市信息,根据省份...
赞助商链接
别人正在看什么?
赞助商链接

我要回帖

更多关于 天气预报安卓 的文章

 

随机推荐