Android游戏开发:活动生命周期与输入设备处理
立即解锁
发布时间: 2025-08-24 00:52:47 阅读量: 3 订阅数: 8 


Android游戏开发实战指南
### Android游戏开发:活动生命周期与输入设备处理
#### 1. 活动添加与活动栈机制
在Android开发中,若要添加一个测试活动到测试应用,需按以下步骤操作:
1. 在清单文件中以`<activity>`元素的形式定义活动,它是`<application>`元素的子元素。示例如下:
```xml
<activity android:label="Life Cycle Test"
android:name=".LifeCycleTest"
android:configChanges="keyboard|keyboardHidden|orientation" />
```
2. 在`com.badlogic.androidgames`包中添加一个名为`LifeCycleTest`的新Java类。
3. 将类名添加到之前定义的`AndroidBasicsStarter`类的`tests`成员中。
应用中的活动存在一个活动栈。每次启动新活动时,它会被压入栈中;关闭新活动时,栈顶的活动会被弹出并恢复,成为屏幕上的新活动。所有活动共享同一个虚拟机(VM)和内存堆。使用静态字段时需谨慎,因为它们在活动销毁和垃圾回收后仍会占用内存,可能导致内存泄漏。
#### 2. 活动生命周期理论
活动有三种状态:
- **运行状态**:这是顶级活动,占据屏幕并直接与用户交互。
- **暂停状态**:活动仍在屏幕上可见,但部分被透明活动、对话框遮挡,或手机屏幕被锁定。处于暂停状态的活动可能随时被Android系统终止。
- **停止状态**:活动被另一个活动完全遮挡,不再在屏幕上可见。例如,启动测试活动时,`AndroidBasicsStarter`活动会进入此状态;用户按下主页按钮暂时返回主屏幕时也会出现这种情况。系统在内存不足时可能会完全终止该活动。
活动有一些可重写的受保护方法,用于获取状态变化信息:
| 方法 | 描述 |
| ---- | ---- |
| `Activity.onCreate()` | 活动首次启动时调用,用于设置所有UI组件并连接到输入系统,在活动生命周期中仅调用一次。 |
| `Activity.onRestart()` | 活动从停止状态恢复时调用,之前会调用`onStop()`。 |
| `Activity.onStart()` | 在`onCreate()`之后或活动从停止状态恢复时调用。 |
| `Activity.onResume()` | 在`onStart()`之后或活动从暂停状态恢复时调用。 |
| `Activity.onPause()` | 活动进入暂停状态时调用,应在此方法中保存所有需要持久化的状态。 |
| `Activity.onStop()` | 活动进入停止状态时调用,之前会调用`onPause()`。 |
| `Activity.onDestroy()` | 活动生命周期结束且不可撤销地销毁时调用,但可能不会被调用。 |
以下是活动生命周期的流程图:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([创建活动]):::startend --> B(Activity.onCreate()):::process
B --> C(Activity.onStart()):::process
C --> D(Activity.onResume()):::process
D --> E(运行状态):::process
E --> F{是否暂停?}:::decision
F -- 是 --> G(Activity.onPause()):::process
G --> H{是否停止?}:::decision
H -- 是 --> I(Activity.onStop()):::process
I --> J{是否重新启动?}:::decision
J -- 是 --> K(Activity.onRestart()):::process
K --> C
H -- 否 --> G
F -- 否 --> E
G --> L{是否销毁?}:::decision
L -- 是 --> M(Activity.onDestroy()):::process
M --> N([活动销毁]):::startend
```
我们可以总结出三个重要的经验:
1. 活动进入运行状态前,`onResume()`方法总会被调用,可忽略`onRestart()`和`onStart()`方法。
2. 活动在`onPause()`之后可能被静默销毁,应忽略`onStop()`和`onDestroy()`方法,仅重写`onPause()`方法,并在此方法中保存需要持久化的状态。
3. 可在`onPause()`方法中调用`Activity.isFinishing()`方法,判断活动是否会在`onPause()`调用后终止。
#### 3. 活动生命周期实践
以下是一个演示活动生命周期的示例代码:
```java
package com.badlogic.androidgames;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class LifeCycleTest extends Activity {
StringBuilder builder = new StringBuilder();
TextView textView;
private void log(String text) {
Log.d("LifeCycleTest", text);
builder.append(text);
builder.append('\n');
textView.setText(builder.toString());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText(builder.toString());
setContentView(textView);
log("created");
}
@Override
protected void onResume() {
super.onResume();
log("resumed");
}
@Override
protected void onPause() {
super.onPause();
log("paused");
if (isFinishing()) {
log("finishing");
}
}
}
```
在这个示例中,我们使用`TextView`显示状态变化,并将所有状态变化输出到`LogCat`。运行应用时,可执行以下操作序列来观察活动生命周期:
1. 从启动活动启动测试活动。
2. 锁定屏幕。
3. 解锁屏幕。
4. 按下主页按钮返回主屏幕。
5. 在主屏幕上长按主页按钮,选择`Android Basics Starter`应用恢复测试活动。
6. 按下返回按钮返回启动活动。
#### 4. 输入设备处理 - 触摸事件
触摸屏幕是从用户获取输入的重要方式。在Android 2.0之前,API仅支持处理单指触摸事件;Android 2.0(SDK版本5)引入了多点触摸。
##### 4.1 处理单触摸事件
触摸事件通过`OnTouchListener`接口实现报告。该接口只有一个方法:
```java
public abstract boolean onTouch (View v, MotionEvent event)
```
可通过`View.setOnTouchListener()`方法将`OnTouchListener`注册到任何`View`实现中。`MotionEvent`实例有三个相关方法:
- `MotionEvent.getX()`和`MotionEvent.getY()`:报告触摸事件相对于`View`的x和y坐标。
- `MotionEvent.getAction()`:返回触摸事件的类型,如`MotionEvent.ACTION_DOWN`、`MotionEvent.ACTION_MOVE`、`MotionEvent.ACTION_CANCEL`和`MotionEvent.ACTION_UP`。
以下是一个处理单触摸事件的示例代码:
```java
package com.badlogic.androidgames;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
public class SingleTouchTest extends Activity implements OnTouchListener {
StringBuilder builder = new StringBuilder();
TextView textView;
public
```
0
0
复制全文
相关推荐









