地震信息WIDGET

地震简介:

英文:earthquake

 

    地球可分为三层。中心层是地核;中间是地幔;外层是地壳。地震一般发生在地壳之中。地壳内部在不停地变化,由此而产生力的作用(即内力作用),使地壳岩层变形、断裂、错动,于是便发生地震。超级地震指的是震波极其强烈的大地震。但其发生占总地震7%~21%,破坏程度是原子弹的数倍,所以超级地震影响十分广泛,也是十分具破坏力。 

  地震是地球内部介质局部发生急剧的破裂,产生的震波,从而在一定范围内引起地面振动的现象。地震(earthquake)就是地球表层的快速振动,在古代又称为地动。它就像海啸、龙卷风、冰冻灾害一样,是地球上经常发生的一种自然灾害。 大地振动是地震最直观、最普遍的表现。在海底或滨海地区发生的强烈地震,能引起巨大的波浪,称为海啸。地震是极其频繁的,全球每年发生地震约550次.

 

主要功能:

WIDGET主要功能用于从地震信息网上获取当天的或者一段时间内的世界各地的震信息,并在地图上表示出来。

代码介绍:

既然要显示全国或者世界的地震信息,那么我们必须有一个数据源,网上地震信息发布的网站非常多,大家可以去找找看自己合适的,或者用我提供给大家的几个数据源,这些数据源大多都是国外地震信息的,当然也有全球的。

列表如下:

1.KMZ格式

http://maps.google.com/?q=http://www.gearthblog.com/kmfiles/UKearthquake.kmz

KMZGoogle Earth的文件格式.

KML服务有两种,一种是纯文本的XML,一种是将一个纯文本的XML文件和其他资源(如图标)进行zip压缩后形成的KMZ,本质是zip。使用Android解析KML服务需要根据情况首先判断是否需要解压缩,然后再解析XML文本

Android Java中包含了zip压缩解压缩工具库,可以从“java.util.zip”包中进行调用。我们看一下一个KMZ如何被解压缩

代码片段如下:

 

Code

好了,解压缩完成后,重点就在解析KML文本上了。到这里,KMZ其实就是一个XML文件了,我们可以用SAX, XmlDocument, XmlPullParser方法来解析,这些解析的方法网上已经有了很多教程了,我就不多说,这里只用XmlDocument, XmlPullParser两个例子来说名如何解析.

XmlDocument:

Code

XmlPullParser:

Code


2.XML

这个网站专门提供世界地震信息的http://earthquake.usgs.gov/eqcenter/catalogs/

http://earthquake.usgs.gov/eqcenter/catalogs/1day-M2.5.xml这个XML是即时的世界地震信息,我们只需要隔一段时间取一次就行,XML的解析就不多说了,上面已经说明,或者去网上搜,也有很多方式来解析XML.通过解析这些XML可以获得我们所需要的地震信息,然后我们呈现给用户就行了。

3.国内网站

http://www.ceic.ac.cn/ceic/index.jsp

可以通过解析网页得到最新的地震信息

http://www.ceic.ac.cn/ceic/eq.jsp?id=107917

该网站的传值方式很简单,利用ID来传值,我们就可以利用这个,然后放在WebView呈现给用户.

4.取图片方式

因为在我找的数据源中是由一个gif图片组成的一段时间内地震的情况

http://www.iris.edu/seismon/views/eveday//imgs/topMap.eveday.gif

这是这个GIF图,这个图显示的是一段时间内世界上所有地区的地震情况.

http://www.iris.edu/seismon/imgs/top_legend.gif 这个是解释的一段时间的地震图,最好在左上角显示出来.

如何实现我给个思路,我们用相对布局RelativeLayout,然后在这个布局上面放置一个ImageView,这个ImageViewBGhttp://www.iris.edu/seismon/views/eveday//imgs/topMap.eveday.gif

这个图就成了我们的背景,然后我们再在这个imgView上放置一个ImgView,这样就可以将topMap放到toplegend上面了,例子如下..

Code

 

这个例子的效果图如下:


 

这样是可以将几个图片布在一张大的图片上面的..

PS:上面的布局例子并非是地震widget的布局..

上面主要讲的是wdiget布局和数据获取

下来我们来讲如何按时间来定时取数据..假设我们半个小时更新一次数据.

 

Code

这是一个appwidget-provider xml,其中android:updatePeriodMillis="8640000000" 这个属性是说当前widget更新的频率.

我们当然可以利用这个来设定时间来更新,但是这样有个不好的地方,google官方推荐的更新时间是1个小时以上,如果更新过快的话就会比较耗电,毕竟手机还是属于受限设备.

这里我们就用service来做,当widget启动的时候我们启动一个service,service里我们启动一个线程来取数据,取完数据发送一个自定义的Intent给我们的widget,我们的widget就更新界面,同时service里的线程Thread.sleep(1800000);然后会继续取数据来更新我们的widget...

需要注意的是,不要忘了在manifast里注册我们的widgetservice.

代码如下:

 

Code

除此之外,我们还能做个settings.方便用户来作设置之类的操作,这些都可以由大家来随便发挥了,总的来说,这还算是一不算难的widget了,我觉得唯一有些繁琐的地方就是XML的解析了,其它基本上没什么难的地方,毕竟这只是一个小小的 widget.

PS:这个仅仅是我的思路,具体的实现由于是在是没有时间,也就无法放出源代码了,是在是抱歉.以后如果有机会的话我会完全写出来并放出源代码的..