Android开发入门系列教程
第一章:Android基础概念与架构
1.1 Android系统架构
Android系统采用分层架构设计,从下到上包括:
- Linux内核层:提供硬件驱动、进程管理、内存管理等核心功能
- 硬件抽象层(HAL):为上层提供标准接口,屏蔽底层硬件差异
- Android运行时(ART):负责运行Android应用,包括核心库和虚拟机
- 框架层:提供各种API供应用开发使用
- 应用层:用户直接交互的各种应用
1.2 四大组件原理
Android应用由四大组件构成:
Activity(活动):代表一个用户界面
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Service(服务):后台运行的组件
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 执行后台任务
return START_STICKY;
}
}
BroadcastReceiver(广播接收器):接收系统或应用广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理广播消息
}
}
ContentProvider(内容提供器):在应用间共享数据
第二章:开发环境搭建
2.1 必需工具
- Android Studio:官方IDE
- JDK:Java开发工具包(推荐JDK 11或17)
- Android SDK:软件开发工具包
2.2 创建第一个项目
项目结构说明:
MyApp/
├── app/
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/ # Java/Kotlin源代码
│ │ │ ├── res/ # 资源文件
│ │ │ │ ├── layout/ # 布局文件
│ │ │ │ ├── values/ # 字符串、颜色等
│ │ │ │ └── drawable/ # 图片资源
│ │ │ └── AndroidManifest.xml # 应用配置文件
│ └── build.gradle # 模块构建配置
└── build.gradle # 项目构建配置
第三章:UI开发基础
3.1 布局系统原理
Android使用XML定义UI布局,运行时解析为View对象树。
LinearLayout(线性布局)
<?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/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello Android!"
android:textSize="18sp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击我" />
</LinearLayout>
ConstraintLayout(约束布局) - 推荐使用
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="居中文本"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
3.2 事件处理机制
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 视图绑定
textView = findViewById(R.id.textView);
button = findViewById(R.id.button);
// 设置点击监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("按钮被点击了!");
}
});
// Lambda表达式写法(需要Java 8+)
button.setOnClickListener(v -> {
textView.setText("使用Lambda的点击事件");
});
}
}
第四章:Activity生命周期
4.1 生命周期原理
Activity有七个主要生命周期回调方法,理解它们对于管理应用状态至关重要:
public class LifecycleActivity extends AppCompatActivity {
private static final String TAG = "LifecycleActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: Activity被创建");
setContentView(R.layout.activity_lifecycle);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: Activity可见");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: Activity获得焦点");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: Activity失去焦点");
// 保存关键数据
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: Activity不可见");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: Activity重新启动");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: Activity被销毁");
// 释放资源
}
}
4.2 状态保存与恢复
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 保存临时数据
outState.putString("user_input", editText.getText().toString());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢复数据
String userInput = savedInstanceState.getString("user_input");
editText.setText(userInput);
}
第五章:数据存储
5.1 SharedPreferences(轻量级存储)
用于存储简单的键值对数据:
public class PreferenceManager {
private SharedPreferences prefs;
private SharedPreferences.Editor editor;
public PreferenceManager(Context context) {
prefs = context.getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE);
editor = prefs.edit();
}
// 保存数据
public void saveUserName(String userName) {
editor.putString("user_name", userName);
editor.apply(); // 异步保存
}
// 读取数据
public String getUserName() {
return prefs.getString("user_name", "默认用户");
}
// 清除数据
public void clearData() {
editor.clear();
editor.apply();
}
}
5.2 SQLite数据库
创建数据库助手类:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyApp.db";
private static final int DATABASE_VERSION = 1;
// 表名和列名
private static final String TABLE_USERS = "users";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_EMAIL = "email";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_USERS + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL, " +
COLUMN_EMAIL + " TEXT UNIQUE)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
onCreate(db);
}
// 插入数据
public long insertUser(String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
values.put(COLUMN_EMAIL, email);
return db.insert(TABLE_USERS, null, values);
}
// 查询数据
public Cursor getAllUsers() {
SQLiteDatabase db = this.getReadableDatabase();
return db.query(TABLE_USERS, null, null, null, null, null, null);
}
}
第六章:网络请求
6.1 使用Retrofit进行网络请求
首先在build.gradle
添加依赖:
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
定义API接口:
public interface ApiService {
@GET("users/{id}")
Call<User> getUser(@Path("id") int userId);
@POST("users")
Call<User> createUser(@Body User user);
@GET("posts")
Call<List<Post>> getPosts(@Query("page") int page);
}
// 数据模型
public class User {
private int id;
private String name;
private String email;
// getter和setter方法
}
使用Retrofit:
public class NetworkManager {
private static final String BASE_URL = "https://api.example.com/";
private ApiService apiService;
public NetworkManager() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
public void fetchUser(int userId) {
Call<User> call = apiService.getUser(userId);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
User user = response.body();
// 处理用户数据
Log.d("Network", "用户名: " + user.getName());
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e("Network", "请求失败: " + t.getMessage());
}
});
}
}
6.2 权限管理
在AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
第七章:RecyclerView列表展示
7.1 RecyclerView原理
RecyclerView通过ViewHolder模式实现视图复用,提高列表性能。
创建Adapter:
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
private List<User> userList;
private Context context;
public UserAdapter(Context context, List<User> userList) {
this.context = context;
this.userList = userList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context)
.inflate(R.layout.item_user, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
User user = userList.get(position);
holder.nameTextView.setText(user.getName());
holder.emailTextView.setText(user.getEmail());
holder.itemView.setOnClickListener(v -> {
// 处理点击事件
Toast.makeText(context, "点击了: " + user.getName(),
Toast.LENGTH_SHORT).show();
});
}
@Override
public int getItemCount() {
return userList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView;
TextView emailTextView;
public ViewHolder(View itemView) {
super(itemView);
nameTextView = itemView.findViewById(R.id.text_name);
emailTextView = itemView.findViewById(R.id.text_email);
}
}
}
在Activity中使用:
public class UserListActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private UserAdapter adapter;
private List<User> userList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// 加载数据
loadUsers();
adapter = new UserAdapter(this, userList);
recyclerView.setAdapter(adapter);
}
private void loadUsers() {
// 模拟数据
userList.add(new User("张三", "zhangsan@example.com"));
userList.add(new User("李四", "lisi@example.com"));
}
}
第八章:Fragment使用
8.1 Fragment基础
Fragment代表Activity中的一个模块化部分:
public class HomeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 初始化视图
TextView textView = view.findViewById(R.id.textView);
textView.setText("这是首页Fragment");
}
}
8.2 Fragment事务管理
public class MainActivity extends AppCompatActivity {
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 替换Fragment
transaction.replace(R.id.fragment_container, fragment);
// 添加到返回栈
transaction.addToBackStack(null);
// 提交事务
transaction.commit();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 加载默认Fragment
if (savedInstanceState == null) {
replaceFragment(new HomeFragment());
}
}
}
第九章:异步任务处理
9.1 使用协程(Kotlin)或线程池(Java)
Java线程池示例:
public class TaskManager {
private ExecutorService executorService;
private Handler mainHandler;
public TaskManager() {
executorService = Executors.newFixedThreadPool(3);
mainHandler = new Handler(Looper.getMainLooper());
}
public void performBackgroundTask() {
executorService.execute(() -> {
// 后台任务
String result = doHeavyWork();
// 切换到主线程更新UI
mainHandler.post(() -> {
updateUI(result);
});
});
}
private String doHeavyWork() {
// 模拟耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "任务完成";
}
private void updateUI(String result) {
// 更新UI
}
public void shutdown() {
executorService.shutdown();
}
}
第十章:Material Design实践
10.1 使用Material组件
在build.gradle
添加依赖:
dependencies {
implementation 'com.google.android.material:material:1.9.0'
}
创建Material风格的界面:
<!-- 使用MaterialButton -->
<com.google.android.material.button.MaterialButton
android:id="@+id/materialButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Material按钮"
app:cornerRadius="8dp"
app:rippleColor="@color/purple_200" />
<!-- 使用TextInputLayout -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"
app:endIconMode="clear_text">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 使用BottomNavigationView -->
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav_menu" />
进阶学习建议
- 架构模式:学习MVVM、MVP等架构模式
- Jetpack组件:掌握ViewModel、LiveData、Room、Navigation等
- 性能优化:了解内存管理、布局优化、APK瘦身
- 测试:学习单元测试和UI测试
- Kotlin语言:现代Android开发推荐使用Kotlin
实战项目推荐
- 待办事项应用:练习数据存储和UI交互
- 天气应用:练习网络请求和数据展示
- 新闻阅读器:练习RecyclerView和Fragment
- 记账应用:综合运用数据库、图表展示等
调试技巧
- 使用Logcat:
Log.d("TAG", "调试信息");
Log.e("TAG", "错误信息");
Log.i("TAG", "普通信息");
断点调试:在Android Studio中设置断点,逐步调试
Layout Inspector:实时查看视图层级
Profiler:监控CPU、内存、网络使用情况
总结
Android开发涉及面广,需要循序渐进地学习。建议按照以下路径:
- 先掌握Java/Kotlin基础
- 理解Android四大组件
- 熟悉UI开发和事件处理
- 学习数据存储和网络请求
- 掌握常用第三方库
- 了解架构模式和最佳实践
记住,实践是最好的学习方式。每学习一个新概念,都要通过编写代码来加深理解。祝您学习愉快!