我们先了解一下编写程序都要涉及到哪些东西,熟悉一下SDK的基本组件,然后编写一个很简单的小程序。
一、分析Demo
在上一节建立的工程Demo下,打开src/com.android.demo下的DemoActivity.java,如下所示:
Demo程序的代码就只有13行,我们依次来分析一下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.android.demo; /** 申明这个文件的代码属于包“com.android.demo” */
import android.app.Activity; /** 从Android SDK中引用Activity组件 */
import android.os.Bundle; /** 从Android SDK中引用Bundle组件 */
public class DemoActivity extends Activity { /** 新建类DemoActivity,继承Activity,它就拥有Activity的特性了 */
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { /** 重写基类的同名函数,程序运行候创建Activity时被调用 */
super .onCreate(savedInstanceState); /** 调用基类的同名函数 */
setContentView(R.layout.main); /** 设置试图,用于显示界面 */
}
}
|
第1行,声明代码属于哪个包,这里的包名得与文件所在的包对应上,否则会报错。
第3、4行,引用组件。这里的“引用”并不像其他语言的include那样将文件包含进来,只是告诉编译器,后面会使用到这里面的成员。
关于Package 与 Import的详细说明,>>请到这里查看。
第6行,新建一个类DemoActivity,继承Activity。JAVA是一门完全面向对象的语言,所有东西都要封装在类里面,之前不熟悉面向对象的朋友估计会很不习惯(话说我之前用PHP做WEB开发,哪里都能写实现…)。DemoActivity类继承了Activity的特性,就属于一个“Activity”了(前面提过,Activity是Android中的基本组件之前,非常之基础,任何有界面的程序都有它)。
想深入了解“面向对象”的同学,>>请到这里查看。
第9行,重载onCreate函数。有编程经验的同学看到on前缀就知道这个函数是个回调函数,属于小受受,只能“被”,它在Activity这个界面开始创建时被调用。
第10行,调用基类的同名函数。基类还有些事情要处理呢,得通知他。
第11行,指定用哪个视图来显示界面。从字面上可以看到setContentView(R.layout.main),采用R.layout.main作为试图,那么R.layout.main代表什么?我们要修改的话从哪里下手呢呢?
我们在上一节介绍工程文件的时候介绍过一个由IDE自动维护的文件夹gen,里面有个R.java文件,有同学可能明白了,这里就是引用里面的内容,如下所示:
R.layout.main就是R.layout类里面的一个属性,值为0x7f030000,一个资源ID,那么它指向哪里呢?
上图可以看到,真正的视图布局文件在这里。上一节讲过,res文件夹下的资源会自动在R.java里面生成记录,现在看到确实是如此。至于那个资源ID是根据什么规则生成的,那就没研究了,反正他自动维护,我们乐得清闲。
一会儿我们要修改程序界面就可以从这里入手。
Demo程序的代码部分就这么多,是不是觉得其实并没那么难?呵呵。
█ 学过JAVA的同学可能会有疑问了:怎么没有入口函数呢?
我们编写Android程序是在Android SDK下进行的,SDK在背后完成了很多工作,包括程序从哪里运行、怎么渲染视图等等,我们只需要写程序的逻辑部分、视图部分,对于这个程序里的代码来说,DemoActivity类就相当于一个入口了(姑且称之为入口Activity吧),这和原生的JAVA编程是有一点不一样哈。
█ 喜欢动脑经的同学会想:一个程序可能有多个界面,就有多个Activity,那么怎么知道该选择哪个Activity为入口呢?
上一节还提到过一个全局配置文件AndroidMainifest.xml,我们打开看看:
我们可以看到,在这个文件里面配置了所有Activity的信息,DemoActivity里面有两个intent-filter,<action android:name="android.intent.action.MAIN" />,<category android:name="android.intent.category.LAUNCHER" />,发现了LAUNCHER字样,可以猜测这个就是入口标记,我们一会儿验证一下。
二、新建一个Activity
我们新建一个Activity,脱离自动生成的DemoActivity试试
在src下的com.android.demo上点击右键 –> New –> Class
Name处填写类的名称,在这里我们填写launcherActivity,Superclass处我们填写android.app.Activity,就是Activity的基类,其余的不用修改,点击”Finish“,结果如下图所示:
可以看到,launcherActivity新建好了,还自动生成了部分代码,真方便。
糟了,DemoActivity类是大写字母开头的,我们的是小写的l开头,还是统一一下吧:
在launcherActivity.java中直接修改类的名称,将l修改为L,发现IDE报错了(因为JAVA是区分大小写的,类名必须和文件名一样),把鼠标移动到错误的地方,弹出修改建议,我们选择”Rename compilation unit to…“,如下图所示:
报错消失了,文件名也变为大写开头了,真方便…
依瓢画葫芦,把Bundle组件引入进来,import android.os.Bundle;
然后重载onCreate方法。这个必须重载,我们得在里面设置视图呀,操作如下:
LauncherActivity文件上点击右键,Source –> Override/ Implement Methods...,勾选onCreate,点击”OK“,代码就自动生成好了:
三、新建布局
这个Activity还没有视图,我们新建一个:
在res/layout上点击右键,New –> Other
选择Android XML Layout File,点击”Next“,在下一个页面输入布局名称”launcher“,点击”Finish“,布局文件就创建好了:
现在的SDK自带了可视化布局,直接往上拖就行了,不过想要做出好看的界面,还需要深入了解Android界面布局,以后遇到再详细讲解。
可点击标注处切换可视化界面或XML编辑界面,很多XML页面打开都有这个切换按钮,可以进行切换。
这里我们要做一个启动界面,中间加个加载图标,一行文字即可。详细过程不多叙述(因为我都还没完全学会如何布局,不敢误人子弟),最终界面如下所示:
XML文件内容如下,可复制粘贴到文件里:
?
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
|
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical" >
< FrameLayout
android:id = "@+id/frameLayout1"
android:layout_width = "match_parent"
android:layout_height = "match_parent" >
< ProgressBar
android:id = "@+id/progressBar1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center" />
< TextView
android:id = "@+id/textView1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center_horizontal"
android:layout_marginTop = "120dip"
android:text = "Welcome ..."
android:textAppearance = "?android:attr/textAppearanceLarge" />
</ FrameLayout >
</ LinearLayout >
|
在LauncherActivity类的onCreate方法中加上设置视图的代码:
?
1
|
setContentView(R.layout.launcher);
|
这样JAVA代码就编写好了,但还没完,我们还需要在AndroidMainifest.xml文件中添加这个Activity的配置信息,同时将DemoActivity配置中的intent-filter移动到LauncherActivity配置中,验证一下是否真的是入口标志,最终的配置信息如下:
?
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
|
<? xml version = "1.0" encoding = "utf-8" ?>
< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.android.demo"
android:versionCode = "1"
android:versionName = "1.0" >
< uses-sdk android:minSdkVersion = "8" />
< application
android:icon = "@drawable/ic_launcher"
android:label = "@string/app_name" >
< activity
android:name = ".DemoActivity"
android:label = "@string/app_name" >
</ activity >
< activity
android:name = ".LauncherActivity"
android:label = "@string/app_name" >
< intent-filter >
< action android:name = "android.intent.action.MAIN" />
< category android:name = "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
</ application >
</ manifest >
|
一个新的Activity就编写完成了,按照上一节的方法运行看看是否正确:
可以看到,我们亲自编写的Activity运行起来了。正如我们所料,intent-filter段中的那个配置信息确实是起到了标记入口Activity的作用。
程序运行了半天还是一直加载,怎么回事呢?因为程序中没后续动作了。接下来我们修改程序让它跳转到DemoActivity中。
四、Activity之间的跳转
这需要在LauncherActivity类中修改代码,思路是在onCreate被调用、设置好视图后,等待一段时间,再跳转到DemoActivity。开始编码:
?
1
2
3
4
5
6
7
8
9
10
|
Timer timer = new Timer();
timer.schedule( new TimerTask() {
@Override
public void run() {
Intent goIntent = new Intent();
goIntent.setClass(LauncherActivity. this , DemoActivity. class );
startActivity(goIntent);
}
}, 3 * 1000 );
|
这里我们新建了个计时器timer,添加了个任务,在3秒钟后执行。跳转的代码位于第6、7、8行:
建立一个Intent,设置好起始地点(LauncherActivity),目的地点(DemoActivity),开始跳转(startActivity)。
这段代码位于setContentView(R.layout.launcher);之后,最终代码如下所示:
?
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
|
package com.android.demo;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class LauncherActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.launcher);
Timer timer = new Timer();
timer.schedule( new TimerTask() {
@Override
public void run() {
Intent goIntent = new Intent();
goIntent.setClass(LauncherActivity. this , DemoActivity. class );
startActivity(goIntent);
}
}, 3 * 1000 );
}
}
|
保存,再次运行,看欢迎页面是否在3秒钟后跳转到了主页面。
五、遗留的问题
在这一节,又接触了一些新东西,之前没说明,可能有些同学早就产生疑问了,这里集中讲一下:
█ 第二个import语句引入的Bundle是什么,后面一直没用过?
Bundle的字面意思为:捆、束,一组东西,在Android中用来传递数据,表现为Key-Value键值对,可以从一个Activity传递数据到另一个Activity。在这个例子中我们还没用到它,但onCreate函数的参数必须要它,所以,必须import…
█ 最后又用到了个Intent,是什么?
Intent,意图,和Bundle类似,也是包含一组东西,但不仅仅是数据,还包含操作类型、操作对象等信息。在上面的例子中startActivity函数只需要一个goIntent就能实现跳转功能,就是因为goIntent包含了操作所需的东西,如果需要传递其它信息,还需要更复杂的设置。
分享到:
相关推荐
第一个Android程序,简单介绍了android程序的编写,并举了一个简单的例子
第一部分中将首先介绍Android,内容涉及如何安装Android模拟器,如何使用IDE(Intergrated Development Environment,集成开发环境)编写第一个程序。然后,我们将介绍一些基本的概念,比如Android中的生命周期。...
hello world视频教程,希望能够学习者提供帮助,实现对Android基础知识的掌握与理解,为后续学习做好铺垫,实现Android知识的灵活运用
如果你想切实体会Android应用开发之道,如果你是一个刚刚入门的Android爱好者,那么这个程序将帮助你分析android程序的精髓。。。
刚学习安卓 做的第一个小程序
介绍Android的有关信息 3G相关知识 Android的简介 掌握Android IDE相关配置 动手编写第一个Android程序 熟悉Android程序的目录结构
一个基本的Android jni程序
在android环境下编程开发应用软件,是网易公开课视频,老外讲的课,很不错,希望能够班组到你。
003_android之 第一个helloWorld程序视频教材,讲解的比较详细,有兴趣的可以学习下哦。
android 安卓开发指导,介绍安卓的历史,介绍安卓环境的搭建,介绍第一个安卓程序的编写,介绍各个包的主要作用。
本次资源是上手android studio 进行安卓开发的第一个小示例,目的是学习OKhttp3的操作,连接api,连接http协议等操作,完成简单的登录操作。
Android是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • ...
作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度越来越高的Android项目,每个项目中都引入一种新的Android平台特性,并着重指出有助于编写引人入胜的应用程序的技术和最佳实践。 《Android 4高级...
第3章 编写第一个Android应用程序 第4章 掌握Android开发工具 第二部分 Android应用程序设计基础 第5章 剖析Android应用程序 第6章 使用Android Manifest文件定义应用程序 第7章 管理应用程序资源 ...
第1章带领你搭建Android开发环境,完成你的第一个Android程序。 第2至13章完整地讲解了Android开发中的各种基本知识和关键技术,包括四大组件、UI、碎片、广播机制、数据存储、服务、多媒体、网络、定位服务、传感器...
Android提供一个开放的开发环境,为针对移动设备编写创新应用程序带来了激动人心的新机遇。作为使用AndroidSDK构建这些应用程序的实用指南书籍,《Android高级编程》从始至终穿插了一系列示例项目,每个项目都引入...
android输入数据点击按钮就可以传递到另外一个页面显示
市场上第一款支持 Android 的手机是由 HTC 制造并由 T-Mobile 供应的 G1。这款设备从设想到推出花了大约一年的时间,惟一可用的软件开发工具是一些实行增量改进的 SDK 发行版。随着 G1 发行日的临近,Android 团队...