Android 开发之旅:又见Hello World!

来源:互联网 发布:宝洁八大问 知乎 编辑:程序博客网 时间:2024/04/30 01:57

——量变产生质变,如果你从第一篇一直看到了这篇,可以说这就是你的质变点之一。

回顾及展望

经过数篇对Android应用程序的原理的讲述,现在我们大概回顾一下。

  • 首先我们利用Hello World程序介绍了一个Android应用程序的目录结构,包括src文件夹、gen文件夹、Android x文件夹、assets文件夹、AndroidMainifest.xml、default.properties;
  • 接下来我们又站在架构的高度分析了一下Android系统的主要组成部分,包括Linux Kernel、Android Runtime、Libraries、Application Framework、Application;
  • 接下来我们又介绍了Android应用程序的运行及应用程序组件,包括活动(Activities)、服务(Services)、广播接收者(Broadcast receivers)、内容提供者(Content providers)等内容;
  • 接着我们又介绍了如何激活及关闭组件,还有简单的介绍了AndroidMainifest.xml、Intent及其过滤器(这两者我们以后还要通过例子或者单独开篇深入分析);
  • 接着我们站在Android应用程序的角度分析Android中活动与任务,包括活动与任务概述、亲和度和新任务(Affinities and new tasks)、启动模式(Launch modes)、清除栈(Clearing the stack)、启动任务(Starting tasks);
  • 接着我们在Android应用程序运行的角度,简单分析了Android应用程序的进程与线程;
  • 最后我们用分析了Android应用程序组件的生命周期,包括活动的生命周期及他们可能的状态、服务生命周期、广播接收者生命周期、Android应用程序进程的分类及重要性等级。

至此,我们终于算是完全算是双脚步入Android开发的大门了,但我们现在还只能算是金字塔底端的那群人,还需要不断地实践、实践、再实践。而且上面所讲的是作为一个真正Android开发人员必须要深刻理解的东西,如果您还没有达到深刻的程度那请你回去再浏览一遍,然后跟着我的这个系列继续深入学习,在接下来的文章我将更多的是利用实例来解析这些东西。下面我再次用Hello World程序来分析一下Android应用程序,主要内容如下:

  • “Hello World!”显示浅析
  • “Hello World!”的手术(一)
  • “Hello World!”的手术(二)
  • “Hello World!”的手术(三)

1、“Hello World!”浅析

首先我们再次简单地新建一个Hello World项目,它的布局文件res/layout/main.xml的代码如下:
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
LinearLayout>
元素的android:text就是我们在屏幕上显示的“Hello World, HelloWorld!”,android:text的值是“@string/hello”,它是如何在屏幕上显示“Hello World, HelloWorld!” 的呢?。

在main.xml文件中以这种格式:
@[package:]string/some_name (where some_name  is the name of a specific string)
引用res/values/strings.xml文件中的字符串,其中some_name是要引用的字符串的名字。strings.xml文件代码如下:
xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, HelloWorld!string>
    <string name="app_name">HelloWorldstring>
resources>
由此可见,上面那个的android:text引用的字符串是“Hello World, HelloWorld!”。接着想象一下,“Hello World, HelloWorld!”何时加载显示的呢?

Note:这种的text的值是存储在strings.xml中的,而不是硬编码的。这样的好处是,当我们在strings.xml中修改hello的具体值时,不需要在main.xml中修改。

我们来看下src目录下skynet.com.cnblogs.www包(就是新建Hello World项目时定义的包名)中的HelloWorld.java文件,代码如下:
package skynet.com.cnblogs.www;

import android.app.Activity;
import android.os.Bundle;

public class HelloWorld extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
可以看出在创建活动时,即void onCreate(Bundle saveInstanceState)中,在HelloWorld中重写了它,在该方法中首先调用了父类的onCreate方法且接着调用了setContentView(R.layout.main)方法。是的,就是在这个方法中,根据main.xml文件将其显示出来,因为R.layout.main是表示布局资源文件main.xml编译后的对象,Eclipse插件会自动在R.java文件中创建这个引用。main.xml中定义了,然后根据它的android:text属性引用到strings.xml文件中的<string name="hello">Hello World, HelloWorld!string>元素,然后将它显示到屏幕上。

从活动的生命周期可以知道,任何一个活动启动的一个方法是onCreate()方法,在这里做一些初始化的工作,诸如创建视图、绑定数据列表等。在HelloWorld项目中,就是调用setContentView进行初始化工作,将Hello World, HelloWorld!显示到屏幕上。

至此,我们对Hello World的认识更加深入了一点!下面我们让拿起手术刀对它进行一个手术。

2、Hello World的手术(一)

我们将main.xml文件中的元素删掉,取而代之用一个Button来显示“Hello World!”。代码如下:
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:text="@string/hello"
    />
LinearLayout>
其它的地方不用修改,直接运行即可!

默认HelloWorldButtonHelloWorld

                                     图1、修改之前的                                                                       图2、修改之后的

从这个例子我们可以看出我们上节的分析是对的,接下来我们继续对它做一个手术。

3、Hello World的手术(二)

我们这次不用Button来显示“Hello World!”,我们这次用一个图片来显示。首先我们准备一张png的图片,如下:hello

图3、hello.png

接下来我们将它复制到, res/drawable-dhpi中。然后我们查看R.java文件我们会发现,R中自动加了一行:(关于R文件,你可以参考Android 开发之旅:HelloWorld项目的目录结构中的1.2、gen文件夹
/* AUTO-GENERATED FILE.  DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found.  It
* should not be modified by hand.
*/


package skynet.com.cnblogs.www;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int hello=0x7f020000;//这行是Android自动新加的
        public static final int icon=0x7f020001;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

删除刚才我们添加的

原创粉丝点击