【读书笔记《Android游戏编程之从零开始》】2.Hello,World!
本人看的是PDF文档,很多都是直接都是复制粘贴的记录,简单的记录下笔记!
2.1 创建一个Android项目
Application Name: 应用名称(安装在手机上显示的名字)
Project Name : 项目名称
Package Name : 包名
Min SDK Version : 最低运行版本号
Create Activity : 主Activity类名
Minimum Required SDK : 最低要求的sdk
Target SDK : 选择目标SDK
Compile SDK : 编译SDK
Theme: 主题
Holo : n. 完全;整体
Holo Dark : 全黑
Holo Light:全息光
None(默认值)
2.2 剖析 Android Project 结构
1. src 目录用来存放项目源代码(.java)
2. gen 目录下存放R.java 文件,R.java文件是该项目所有资源的索引文件,在建立项目时自动生成,R.java 文件属于只读模式,不能更改,一般不会对其进行修改。R 类中包含很多静态类,其中这些静态类的名称和res 目录下的资源目录一一对应。
3. Android (Library) 目录: 此目录下的“android.jar”文件指向的是 Android SDK,是开发Android应用程序所用到的所有API函数库。
4. assets 目录是用来存放引用的外部资源,此目录与res 目录最大的区别在于 res 路径下的资源文件都会在R 资源文件中自动生成对应的资源ID,而assets 目录下的资源不会。
5. res 目录是用来存放项目中用到的资源文件。
6.AndroidManifest 是当前项目的配置文件,其中包括编码格式、应用的icon、程序的版本号以及指定该程序使用到的服务等等。
7. default.properties 是记录项目工程的环境信息。
2.3 AndroidManifest.xml 与应用程序功能组件
在每个 Android 应用程序中都必须具备 AndroidManifest.xml 这个文件,此文件定义了该程序的主要功能、处理的信息,以及执行的动作等等。
在上面的层次图中,在同一层的标签都是按照位置关系写在了一起,不同层的标签并不都是包含关系。
1. 最外层的<manifest>定义了软件的属性,如包路径、程序的版本、版次等等。
2. 第2层<application>定义应用程序属性及功能;如 android:icon 指定了应用的 icon图标, android:label 定义了应用程序的名称,并且声明功能<activity>活动。
3. 第3层是定义功能组件的一层,如<activity> 活动、<receiver> 意图与广播接收、<service>服务、<provider>属性(内容)提供者,都必须定义在<application>中,所以这里定义了<activity>活动类以及活动类名称。
4. <intent-filter> 其功能如一个过滤器。
5.第5层中的<action>定义了意图动作的类型;<category>是意图的属性,这里的值android.intent.category.LAUNCHER 表示启动应用程序的时候,意图将该 activity显示在屏幕上;这种启动程序的意图活动只能有一个。
<activity> - Activity(活动)
Android中一个 activity 就是一个用户界面,比如手机拨号界面、通讯录界面等都是活动。在应用程序中可以有一个或多个活动,但是如果新建了一个活动,必须在AndroidManifest.xml 中声明。
<receiver> - Intent (意图) 与 Broadcast Receiver (广播接收)
意图是描述动作的机制,在 Android 手机中几乎都有意图阶段。例如,当前有一个“发出一条信息”的意图(Intent), 这时候如果应用程序需要发送消息,调用该意图即可。
既然有意图,当然也需要在应用程序中注册一个活动来处理该意图,那么接收意图可称为 Broadcast Receiver (广播接收); 举个例子,比如手机启动的时候会有一个系统发出“系统启动”的意图,只要在应用程序中注册活动来接受此意图,就可以让其应用程序在手机启动的时候自动启动程序。因为在 Android中有很多意图,为了使接收具有针对性,可以在 <intent-filter>中指定接收意图的动作<action>,因此 <intent-filter>的作用就是一个意图的过滤器。
<service> - 服务
简单来说,就是应用程序在后台运行的任务,无需显示界面、也不必跟用户进行交互,但是又需要长时间在后台进行运行;例如 Android 系统中的音乐播放器,当选定歌曲进行播放时,即时用户将播放器应用程序放入后台,然后打开其他程序,音乐也会照常播放,那么肯定播放器程序添加了 service 服务功能。
<provider> - Content Provider (内容提供者)
带有内容提供者功能的应用所进行的动作是让使用者可以保存他们的信息或文件,例如:Android 手机联系人程序提供了一个内容提供者,任何要使用联系人信息的应用程序都可以共享内容提供者的所有信息,比如联系人的姓名、电话号、地址等等。
在AndroidManifest.xml 文件中除了以上介绍的功能组件之外,Android 对某些关键操作和访问都是有权限来限制的。假如一个应用程序需要将一些数据保存到手机的 SDCard 中,那么就需要在AndroidManifest.xml 中设置添加写入 SD卡权限,其语法是 <uses-permission>。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission>和<application>在AndroidManifest.xml 语法中属于同一层次。
2.4 运行 Android 项目(启动 Android 模拟器)
太简单,可以百度,略
2.5 详解第一个 Android 源码
@Override //重写了基类Activity中的onCreate()方法;如果没有这个标志,编译代码的时候会认为是开发者自定义的函数 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
对于布局、组件等属性的设置格式一般为:
<布局/组件名称 android:属性="属性类型" ... />
2.6 Activity 生命周期
单个Activity的生命周期
1. onCreate: Activity 初次创建时被调用,一般在这里创建 view、初始化布局信息、将数据绑定到 list 以及设置监听器等等。如果Activity 首次创建,本方法将会调用 onStart(); 如果 Activity是停止后重新显示,则将调用 onRestart() 。
2. onStart: 当Activity对用户即将可见的时候被调用,其后调用 onResume() 。
3. onRestart: 当Activity停止后重新显示的时候会被调用,然后调用 onStart() 。
4.onResume: 当用户能在界面中进行操作的时候被调用。
5. onPause: 当系统要启动一个其他的Activity时调用(其他的Activity 显示之前),这个方法用来停止动画和其他占用CPU资源的事情。所以在这里应该提交保存那些持久数据,这些数据可以在 onResume() 方法中读出。
6. onStop: 当另外一个 Activity 恢复并遮盖住当前 Activity, 导致其对用户不再可见时调用。 一个新 Activity启动、其他 Activity 被切换至前景、当前 Activity 被销毁时都会调用此函数。如果当 Activity 重新回到前景与用户交互时会调用 onRestart(),如果 Activity将退出则调用 onDestory() 。
7. onDestory: 在当前的Activity 被销毁前所调用的最后一个方法,当进程终止时调用(对Activity 直接调用 Finish 方法或者系统为了节省空间而临时销毁此 Activity的实例)。
代码:
package com.example.activitytry; import android.os.Bundle; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("----------onCreate------------"); } @Override protected void onDestroy() { super.onDestroy(); System.out.println("----------onDestroy------------"); } @Override protected void onPause() { super.onPause(); System.out.println("----------onPause------------"); } @Override protected void onRestart() { super.onRestart(); System.out.println("----------onRestart------------"); } @Override protected void onResume() { super.onResume(); System.out.println("----------onResume------------"); } @Override protected void onStart() { super.onStart(); System.out.println("----------onStart------------"); } @Override protected void onStop() { super.onStop(); System.out.println("----------onStop------------"); } }
(1)受限启动项目进入MainActivity类,打印信息如下图所示:
(2)单击手机上的“Back”按键,打印信息如下图所示:
(3)“Back”后重新点击程序图标进入,打印信息如下图所示:
(4)单击手机上的“Home”(小房子)按键,打印信息如下图所示:
(5)“Home”后单击程序图标进入,打印信息如下图所示:
以上5中状态,详细的诠释了一个Activity的生命周期。这5个状态中值得注意的是切入后台“Back”和“Home”的区别,如下图所示:
多个Activity的生命周期
一个 Android应用程序,是可以存在多个Activity的。
package com.example.activitytry; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.v("MainActivity","----------onCreate------------"); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent i = new Intent(MainActivity.this, OtherActivity.class); startActivity(i); } }); } @Override protected void onDestroy() { super.onDestroy(); Log.v("MainActivity", "----------onDestroy------------"); } @Override protected void onPause() { super.onPause(); Log.v("MainActivity", "----------onPause------------"); } @Override protected void onRestart() { super.onRestart(); Log.v("MainActivity", "----------onRestart------------"); } @Override protected void onResume() { super.onResume(); Log.v("MainActivity", "----------onResume------------"); } @Override protected void onStart() { super.onStart(); Log.v("MainActivity", "----------onStart------------"); } @Override protected void onStop() { super.onStop(); Log.v("MainActivity", "----------onStop------------"); } }
如下图所示,添加“跳转”按钮,单击按钮会跳转到另外的一个Activity(OtherActivity)。
(1)在MainActivity中,单击“跳转”按钮:
(2)当OtherActivity打开后,单击手机上的“Back”按钮:
Android OS 管理 Activity 的方式
对于Activity的管理,Android底层是用堆栈来存放Activity的,也就是说打开后Activity将放入栈顶,显示在屏幕的最上层,而之前的Activity则会被新打开的Activity覆盖。例如一个程序正在运行,突然手机来电,Android接收到来电广播后会打开一个接听电话的Activity放入堆栈的栈顶,这样一来运行的程序就会被接听到的Activity所覆盖。
2.7 Android 开发常见问题
Android SDK 与 Google APIs 创建 Emulator的区别
将Android项目导入Eclipse
在 Eclipse 中显示Android开发环境下常用的View窗口
在 Eclipse 中利用打印语句(Log) 调试Android 程序
在 Eclipse 中 真机运行Android项目
模拟器横竖屏切换
模拟器横竖屏切换的方法是同时按下电脑键盘的“Ctrl”和“F11”两个按键,或者同时按下“Ctrl”和“F12”也可以。
打包Android项目
所有的Android应用程序都以“.apk”为后缀名命名一个安装包,这个apk包中包含应用编译后源码、资源文件、应用的版本信息、用到的权限等等。
在Android系统的手机上安装apl文件的时候,其应用程序不仅用到“.apk”为后缀的文件,而且还必须利用数字证书签名后才可以安装到手机或者模拟器上。