ather.entity 实体类
panda.weather.service 后台服务
assets 存放数据库文件
res 资源文件:图片、布局文件等
5.2 相关技术介绍
5.2.1 Activity
Activity是Android平台中非常重要的一个组件,是所有程序的根本,所有程序的流程都运行在Activity之中,是Android当中最基本的模块之一。
每一个Activity代表着一个界面,它有自己的生命周期,即它的一个产生、运行、销毁的一个周期,对于Activity,关键是其生命周期的把握,其次就是状态的保护和恢复。这个过程官方给出了描述,如图5.2所示:
图5.2:Activity生命周期
每一个Activity本身是一个Java文件,在这个Java文件里有控件的设置和函数的操作等,但是页面的布局却不在Java文件中,而是一个xml文件,放在res目录的Layout文件夹中;每一个xml文件称为一个Layout布局文件,在对应的Java文件中设置应用的是哪个布局文件,每一个Activity对应一个布局文件。这里的布局类似于HTML中 CSS + DIV的设计模式,通过设置控件的属性改变控件的位置和显示效果,容易实现和调试。
5.2.2 Intent
Intent是将一个要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成Android各个组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及到的数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
Intent主要是用来启动其他Activity或者Service,所以可以将Intent理解成Activity之间的粘合剂。Intent的使用具体有以下3种形式:
1.通过startActivity方法来启动一个新的Activity;
2.通过Broadcast Intent 机制可以将一个Intent发送给任何对这个Intent反省去的BroadcastReceiver;
3.通过startService或者bindService方法来和后台的Service进行交互。
5.2.3 Service
Service也是Android系统中一种很重要的组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service执行的是没有界面的长生命周期的代码。Service是一种程序,它可以运行很长时间,但是它却没有用户界面。Service可以再多场合的应用中使用。
5.2.4 SQLite
SQLite数据库是Android平台内嵌的数据库,它是一个轻型的关系型数据,提供完整的对关系型数据库的操作,对SQLite的操作和其他关系型数据库类似,这里简要介绍一下。
这里是在Windows平台下,首先打开已创建的Android虚拟设备,然后打开命令行提示符,输入 adb shell 命令,切换到Android平台下,进入到创建数据库的目录,然后输入命令 sqlite3数据库名,就可以打开对应的SQLite数据库。接下来就可以进行需要的操作了,不同的是,SQLite 的命令在前面都需要加上一个点,比如查看数据库中的表:. schema,查看表中所有数据:. select * from table; 等,其他命令与此类似。
这里需要指出的是,在SQLite数据库的每张表中必须有一个字段是类似于 _id 的整型值,设置为主键,可自动插入,也可手动添加。有关SQLite数据库的内容就介绍到这里,更多的可以到帮助文档中查找。
5.2.5 布局及控件介绍
Android系统中界面布局方式有很多种,有线性布局、相对布局、表格布局等,布局文件以xml文件的形式存放在系统的资源文件夹中,这里只详细介绍程序中大量用到的线性布局。
线性布局在代码中表示为Linearlayout,它是以线性的方式逐个显示在它内部声明的控件,布局的方向有垂直和水平两种,并且可以设置宽高等很多属性。
在布局当中添加的是控件,下面是对一些常用控件的简单介绍:
TextView:文本显示域,显示的信息内容为字符串形式;
ImageView:图片显示域,显示的内容为图片;
Button:按钮,可以设置响应的监听器,执行某种操作;
EditText:输入文本框,为用户提供输入数据的接口;
控件中的属性有很多,大体上是类似的,也有个别属性是特有的,这里不再详细介绍,在用到的时候可以查阅相关文档。
这里需要指出的是,不论是控件还是资源文件,在应用程序中用到的时候,都是通过R.java中的整型值引用的,然后进行对对象进行操作。
5.3 城市码获取
软件中用到的天气数据来自于中国气象局,这个数据源是免费的,它提供了全国2564个县级以上城市的天气信息,每一个城市对应一个城市码。在获取某一城市的天气数据的时候,就是依据这个城市的城市码向服务器发送请求,然后得到对应的天气数据后返回,在界面中显示给用户,所有城市的天气数据的获取都依赖于对应的城市码,所以得到所有的城市名及其城市码就是重中之重的事情。
获取城市及其城市码的地址是m.weather/data5/ ,后面加上city.xml得到省份编号,然后跟上省份编号得到地区编号,再用省份编号+地区编号就可以得到这个地区中所有城市的编号,最后把省份编号+地区编号+城市编号得到的就是城市对应的城市码,通过链接 m.weather/data/城市码.html就可以获取这个城市的所有天气数据。这里写了一个程序来获取这些数据。
这个程序通过遍历来得到所有的城市信息。首先下载得到包含城市信息的文本内容,然后再解析这个文本得到城市和编号。遍历全部数据后,把结果保存起来。
创建连接,然后读入数据,最后将得到的内容以字符串的形式返回。下载函数如下:
public static String getInfo(String url) {
BufferedReader in = null;
String info = "";
try {
URL file;
file = new URL(url);
in = new BufferedReader(new InputStreamReader(file.openStream()));
String line;
while ((line = in.readLine()) != null) {
info = info + line;
}
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return info;
}
每次得到的下载内容包含的是一组数据,这组数据包含很多小组数据,每小组数据用一个“,”分割,在每小组数据中有城市名和城市编号,它们之间又用一个“|”分割,对这组内容进行解析后得到一个包含城市名和城市编号的二维数组,解析函数如下:
public static String[][] parseCity(String content){
if(content!=null && content.trim().length()!=0){
StringTokenizer st = new StringTokenizer(content, ",");
int count = st.countTokens();
String[][] citys = new String[count][2];
int i = 0;
int index = 0;
while(st.hasMoreTokens()){
String city = st.nextToken();
index = city.indexOf('|');
citys[i][0] = city.substring(0, index);
citys[i][1] = city.substring(index + 1);
i = i + 1;
}
return citys;
}
return null;
}
上面介绍的是下载函数和解析函数。具体的获取过程通过不断的修改链接地址并调用这两个函数,最后就能够获取全部的数据,最后以文本的形式暂时存储起来。遍历函数代码如下:
public void doIt() {
int init = 0;
String webContent;
String urlPre = "m.weather/data5/city";
// httpDownloader.download("m.weather/data5/city.xml");
// 得到省份或一级直辖市代码 [代码][名称]
webContent = GetInfo.getInfo(urlPre + ".xml");
String[][] provinces = WeaterInfoParser.parseCity(webContent);
String[] groups
上一篇:
关于android手机的论文
下一篇:
试论APP广告在手机中的应用