Android 开发之旅:又见Hello World!

简介:




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

回顾及展望

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

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

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

  1. “Hello World!”显示浅析
  2. “Hello World!”的手术(一)
  3. “Hello World!”的手术(二)
  4. “Hello World!”的手术(三)

1、“Hello World!”浅析

首先我们再次简单地新建一个Hello World项目,它的布局文件res\layout\main.xml的代码如下:

 
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >   
  7. <TextView    
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="@string/hello"   
  11.     />   
  12. </LinearLayout>  

元素<TextView>的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文件代码如下:

 
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <resources>   
  3.     <string name="hello">Hello World, HelloWorld!</string>   
  4.     <string name="app_name">HelloWorld</string>   
  5. </resources>  

由此可见,上面那个<TextView>的android:text引用的字符串是“Hello World, HelloWorld!”。接着想象一下,“Hello World, HelloWorld!”何时加载显示的呢?

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

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

 
  1. package skynet.com.cnblogs.www;   
  2.  
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5.  
  6. public class HelloWorld extends Activity {   
  7.     /** Called when the activity is first created. */   
  8.     @Override   
  9.     public void onCreate(Bundle savedInstanceState) {   
  10.         super.onCreate(savedInstanceState);   
  11.         setContentView(R.layout.main);   
  12.     }   

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

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

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

2、Hello World的手术(一)

我们将main.xml文件中的<TextView>元素删掉,取而代之用一个Button来显示“Hello World!”。代码如下:

 
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >   
  7. <Button   
  8. android:layout_width="fill_parent"   
  9.     android:layout_height="fill_parent"   
  10.     android:text="@string/hello"   
  11.     />   
  12. </LinearLayout> 

其它的地方不用修改,直接运行即可!

Android 开发之旅:又见Hello World!

图1、修改之前的

Android 开发之旅:又见Hello World!

图2、修改之后的 
 

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

3、Hello World的手术(二)

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

Android 开发之旅:又见Hello World!

图3、hello.png

接下来我们将它复制到, res/drawable-dhpi中。然后我们查看R.java文件我们会发现,R中自动加了一行:(关于R文件,你可以参考Android 开发之旅:HelloWorld项目的目录结构中的1.2、gen文件夹

 
  1. /* AUTO-GENERATED FILE.  DO NOT MODIFY.   
  2.  
  3. * This class was automatically generated by the   
  4. * aapt tool from the resource data it found.  It   
  5. * should not be modified by hand.   
  6. */   
  7.  
  8. package skynet.com.cnblogs.www;   
  9.  
  10. public final class R {   
  11.     public static final class attr {   
  12.     }   
  13.     public static final class drawable {   
  14.         public static final int hello=0x7f020000;//这行是Android自动新加的   
  15.         public static final int icon=0x7f020001;   
  16.     }   
  17.     public static final class layout {   
  18.         public static final int main=0x7f030000;   
  19.     }   
  20.     public static final class string {   
  21.         public static final int app_name=0x7f040001;   
  22.         public static final int hello=0x7f040000;   
  23.     }   

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

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

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

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

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

删除刚才我们添加的<Button>元素,添加一个<ImageView>元素。

 
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >   
  7. <ImageView   
  8. android:id="@+id/imageview"   
  9. android:layout_width="wrap_content"   
  10.     android:layout_height="wrap_content"   
  11.     android:src="@drawable/hello"   
  12. />   
  13. </LinearLayout>  

运行之后,结果如下所示:

Android 开发之旅:又见Hello World!

 图4、图片显示Hello World

我们看到上面的ImageView有一个id属性。其实,每个View对象都有一个关联的ID,来唯一标识它。当应用程序被编译时,这个ID作为一个整数引用。但是ID通常是在布局XML文件中作为字符串分配的,在元素的id属性。这个XML属性对所有的View对象可用且会经常用到。XML中的ID语法如下:android:id="@+id/my_button"

字符串前的@符号表示XML解析器应该解析和扩展剩下的ID字符串,并把它作为ID资源。+符号表示这是一个新的资源名字,它必须被创建且加入到我们的资源(R.java文件,R是Resource)。Android框架提供一些其他的ID资源。当引用一个Android资源ID时,你不需要+符号,但是你必须添加android包名字空间,如下:android:id="@android:id/empty"

4、Hello World的手术(三)

上面两个手术都是基于main.xml的,在布局资源文件中声明相应的控件并设置相关属性,如TextView、Button、ImageView等,然后在onCreate()方法中调用setContentView(R.layout.main)方法来输出。其实上面的几个实验我们都可以编程地进行,下面就以编程地用ImageView显示“Hello World!”,别的也是类似来完成。

首先,我们将main.xml文件中的<ImageView>删掉,且将res/values/strings.xml中的<string name="hello">Hello World, HelloWorld!</string>删掉(其实第3节,用图片显示就没有用到它);然后,在HelloWorld.java文件中 import android.widget.ImageView;且删掉onCreate()方法中调用setContentView(R.layout.main)方法,因为我们不需要根据main.xml布局资源文件来显示而是编程地Hello World。

接下来我们在onCreate()方法中声明一个ImageView对象,并设置它的图像资源,最后将这个ImageView对象传给setContentView()方法,代码如下:

 
  1. package skynet.com.cnblogs.www;   
  2.  
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5. import android.widget.ImageView;   
  6.  
  7. public class HelloWorld extends Activity {   
  8.     /** Called when the activity is first created. */   
  9.     @Override   
  10.     public void onCreate(Bundle savedInstanceState) {   
  11.         super.onCreate(savedInstanceState);   
  12.         ImageView imageHello=new ImageView(this);   
  13.         imageHello.setImageResource(R.drawable.hello);   
  14.         setContentView(imageHello);   
  15.     }   
  16. }  

运行之后,同样会得到Hello World的手术(二)的结果,只是图片的显示位置不太一样。在这里注意上面那行粗体代码,如果是TextView或者Button的话,应该调用setText()方法来设置”Hello World!”。

Android 开发之旅:又见Hello World!

图5、编程地显示Hello World!

Note:构建ImageView对象时传递了一个this参数,表示与当前上下文(context)关联。这个Context由系统处理,它提供诸如资源解析、获取访问数据库和偏好等服务。因为Activity类继承自Context,且因为你的HelloWorld类是Activity的子类,它也是一个Context。因此,你可以传递this作为你的Context给ImageView引用。

本系列的其它文章:

  1. Android 开发之旅:环境搭建及HelloWorld
  2. Android 开发之旅:HelloWorld项目的目录结构
  3. Android 开发之旅:android架构
  4. Android 开发之旅:应用程序基础及组件
  5. Android 开发之旅:应用程序基础及组件(续)
  6. Android 开发之旅:活动与任务
  7. Android 开发之旅:进程与线程
  8. Android 开发之旅:组件生命周期(一)
  9. Android 开发之旅:组件生命周期(二)
  10. Android 开发之旅:组件生命周期(三) 

     本文转自Saylor87 51CTO博客,原文链接:http://blog.51cto.com/skynet/365358,如需转载请自行联系原作者




相关文章
|
24天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
101 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
1月前
|
机器学习/深度学习 调度 Android开发
安卓应用开发:打造高效通知管理系统
【2月更文挑战第14天】 在移动操作系统中,通知管理是影响用户体验的关键因素之一。本文将探讨如何在安卓平台上构建一个高效的通知管理系统,包括服务、频道和通知的优化策略。我们将讨论最新的安卓开发工具和技术,以及如何通过这些工具提高通知的可见性和用户互动性,同时确保不会对用户造成干扰。
33 1
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
19 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
16天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
18天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
18天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
19 1
Android开发之使用OpenGL实现翻书动画
|
18天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
15 1
Android开发之OpenGL的画笔工具GL10
|
24天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
12 0