Android:APP代码结构与运行流程详解(Java版)

Android应用代码结构与运行流程详解(Java版)

一、Android应用代码结构

1.1 项目整体结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MyApp/
├── app/
│ ├── manifests/ # Android清单文件
│ │ └── AndroidManifest.xml
│ ├── java/ # Java源代码
│ │ └── com/example/myapp/
│ │ ├── MainActivity.java
│ │ ├── models/ # 数据模型类
│ │ ├── adapters/ # 适配器类
│ │ ├── utils/ # 工具类
│ │ └── ...
│ ├── res/ # 资源文件
│ │ ├── layout/ # 布局文件
│ │ ├── values/ # 值资源(字符串、颜色等)
│ │ ├── drawable/ # 图片资源
│ │ ├── mipmap/ # 应用图标
│ │ └── ...
│ └── build.gradle # 模块构建配置
├── gradle/
└── build.gradle # 项目构建配置

1.2 核心文件详解

AndroidManifest.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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">

<!-- 应用权限声明 -->
<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">

<!-- 主Activity声明 -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!-- 其他组件声明 -->
<service android:name=".MyService" />
<receiver android:name=".MyReceiver" />
</application>
</manifest>

MainActivity.java - 主Activity示例

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.myapp;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 初始化UI组件
TextView textView = findViewById(R.id.text_view);
textView.setText("Hello Android!");

// 示例:处理按钮点击
findViewById(R.id.my_button).setOnClickListener(view -> {
// 处理点击事件
});
}

@Override
protected void onStart() {
super.onStart();
// Activity即将可见时调用
}

@Override
protected void onResume() {
super.onResume();
// Activity获得焦点,可交互
}

@Override
protected void onPause() {
super.onPause();
// Activity失去焦点
}

@Override
protected void onStop() {
super.onStop();
// Activity完全不可见
}

@Override
protected void onDestroy() {
super.onDestroy();
// Activity被销毁前调用
}
}

activity_main.xml - 布局文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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"
android:padding="16dp">

<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />

<Button
android:id="@+id/my_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />
</LinearLayout>

二、Android应用启动与运行流程

2.1 应用启动流程

1
2
3
4
5
6
7
8
9
10
11
12
1. 用户点击应用图标
2. Launcher向AMS发送启动Intent
3. AMS检查应用进程是否存在

4. 如果不存在:Zygote fork新进程 → 创建Application对象

5. 创建主Activity实例

6. 调用Activity生命周期方法:
onCreate() → onStart() → onResume()

7. Activity进入运行状态

2.2 详细启动时序

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Application类(如果自定义)
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate(); // 1. 最先执行
// 全局初始化代码
}
}

// MainActivity生命周期调用顺序
public class MainActivity extends AppCompatActivity {

// 2. Activity被创建
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 必须调用父类方法

// 恢复保存的状态
if (savedInstanceState != null) {
// 恢复数据
}

setContentView(R.layout.activity_main);

// 初始化操作
}

// 3. Activity即将可见
@Override
protected void onStart() {
super.onStart();
}

// 4. Activity获得焦点,可交互
@Override
protected void onResume() {
super.onResume();
}

// 5. 当其他Activity覆盖时
@Override
protected void onPause() {
super.onPause();
// 保存临时数据
}

// 6. Activity完全不可见
@Override
protected void onStop() {
super.onStop();
}

// 7. 从停止状态恢复
@Override
protected void onRestart() {
super.onRestart();
}

// 8. Activity被销毁
@Override
protected void onDestroy() {
super.onDestroy();
// 释放资源
}
}

三、重要注意事项

3.1 线程管理要点

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
// ❌ 错误示例:在主线程执行耗时操作
public void loadData() {
// 网络请求或数据库操作(会导致ANR)
}

// ✅ 正确示例:使用子线程
public void loadData() {
new Thread(() -> {
// 执行耗时操作
String result = fetchDataFromNetwork();

// 更新UI必须回到主线程
runOnUiThread(() -> {
updateUI(result);
});
}).start();
}

// ✅ 更好的方式:使用AsyncTask或协程
private class MyAsyncTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
return fetchDataFromNetwork();
}

@Override
protected void onPostExecute(String result) {
updateUI(result); // 在主线程执行
}
}

3.2 内存管理注意事项

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
34
35
public class MainActivity extends AppCompatActivity {

// ❌ 避免静态引用Activity Context
private static Context sContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// ❌ 错误:静态引用会导致内存泄漏
sContext = this;

// ✅ 正确:使用Application Context
Context appContext = getApplicationContext();

// ❌ 避免非静态内部类隐式持有外部类引用
new Thread(new Runnable() {
@Override
public void run() {
// 长时间运行的任务...
}
}).start();

// ✅ 使用静态内部类或弱引用
new Thread(new MyRunnable()).start();
}

// 静态内部类
private static class MyRunnable implements Runnable {
@Override
public void run() {
// 不持有Activity引用
}
}
}

3.3 生命周期管理最佳实践

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
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends AppCompatActivity {

private TextView mTextView;
private MyDataLoader mDataLoader;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mTextView = findViewById(R.id.text_view);

// 初始化但不要立即开始耗时操作
mDataLoader = new MyDataLoader();
}

@Override
protected void onResume() {
super.onResume();
// 在这里开始UI相关的操作
mDataLoader.startLoading();
}

@Override
protected void onPause() {
super.onPause();
// 在这里暂停不需要后台运行的操作
mDataLoader.pauseLoading();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存临时状态(屏幕旋转等配置变更时调用)
outState.putString("KEY_TEXT", mTextView.getText().toString());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢复保存的状态
String savedText = savedInstanceState.getString("KEY_TEXT");
mTextView.setText(savedText);
}
}

3.4 资源访问注意事项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// ✅ 正确访问资源的方式
String appName = getString(R.string.app_name);
int primaryColor = getResources().getColor(R.color.primary);
float textSize = getResources().getDimension(R.dimen.text_size);

// ❌ 不要硬编码字符串
// String title = "My App";

// ✅ 使用strings.xml
// <string name="app_title">My App</string>
String title = getString(R.string.app_title);
}
}

四、常见问题与解决方案

4.1 应用崩溃常见原因

  1. 空指针异常:使用对象前检查是否为null
  2. 主线程阻塞:耗时操作放入子线程
  3. 内存溢出:及时释放资源,使用合适的数据结构
  4. 权限问题:运行时请求必要权限

4.2 调试技巧

1
2
3
4
5
6
7
8
9
// 使用Log进行调试
Log.d("MainActivity", "当前状态: " + state);
Log.e("MainActivity", "错误信息", exception);

// 使用断点调试
// 在Android Studio中设置断点,使用调试模式运行

// 使用Toast显示临时信息
Toast.makeText(this, "操作完成", Toast.LENGTH_SHORT).show();

4.3 性能优化建议

  1. 布局优化:减少嵌套层级,使用ConstraintLayout
  2. 内存优化:及时回收Bitmap,使用内存缓存
  3. 网络优化:合理使用缓存,合并网络请求
  4. 电池优化:避免不必要的后台服务,使用JobScheduler

五、学习资源推荐

  1. 官方文档:developer.android.com
  2. Android Studio:熟练使用IDE的调试工具
  3. Git:学习版本控制管理代码
  4. 设计模式:学习MVC/MVP/MVVM架构模式

Android:APP代码结构与运行流程详解(Java版)

http://blog.gxitsky.com/2025/12/12/Android-02-App-Structure/

作者

光星

发布于

2025-12-12

更新于

2025-12-12

许可协议

评论