Android开发入门系列教程
Android开发入门系列教程
第一章:Android基础概念与架构
1.1 Android系统架构
Android系统采用分层架构设计,从下到上包括:
- Linux内核层:提供硬件驱动、进程管理、内存管理等核心功能
- 硬件抽象层(HAL):为上层提供标准接口,屏蔽底层硬件差异
- Android运行时(ART):负责运行Android应用,包括核心库和虚拟机
- 框架层:提供各种API供应用开发使用
- 应用层:用户直接交互的各种应用
1.2 四大组件原理
Android应用由四大组件构成:
Activity(活动):代表一个用户界面
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
Service(服务):后台运行的组件
public class MyService extends Service {@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 执行后台任务return START_STICKY;}
}
BroadcastReceiver(广播接收器):接收系统或应用广播
public class MyReceiver extends BroadcastReceiver {@Overridepublic 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"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello Android!"android:textSize="18sp" /><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击我" /></LinearLayout>
ConstraintLayout(约束布局) - 推荐使用
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"><TextViewandroid: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;@Overrideprotected 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() {@Overridepublic 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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate: Activity被创建");setContentView(R.layout.activity_lifecycle);}@Overrideprotected void onStart() {super.onStart();Log.d(TAG, "onStart: Activity可见");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG, "onResume: Activity获得焦点");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG, "onPause: Activity失去焦点");// 保存关键数据}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop: Activity不可见");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG, "onRestart: Activity重新启动");}@Overrideprotected 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);}@Overridepublic 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);}@Overridepublic 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>() {@Overridepublic void onResponse(Call<User> call, Response<User> response) {if (response.isSuccessful()) {User user = response.body();// 处理用户数据Log.d("Network", "用户名: " + user.getName());}}@Overridepublic 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;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_user, parent, false);return new ViewHolder(view);}@Overridepublic 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();});}@Overridepublic 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<>();@Overrideprotected 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 {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_home, container, false);}@Overridepublic 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();// 替换Fragmenttransaction.replace(R.id.fragment_container, fragment);// 添加到返回栈transaction.addToBackStack(null);// 提交事务transaction.commit();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 加载默认Fragmentif (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();// 切换到主线程更新UImainHandler.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.MaterialButtonandroid: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.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名"app:endIconMode="clear_text"><com.google.android.material.textfield.TextInputEditTextandroid:layout_width="match_parent"android:layout_height="wrap_content" /></com.google.android.material.textfield.TextInputLayout><!-- 使用BottomNavigationView -->
<com.google.android.material.bottomnavigation.BottomNavigationViewandroid: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开发和事件处理
- 学习数据存储和网络请求
- 掌握常用第三方库
- 了解架构模式和最佳实践
记住,实践是最好的学习方式。每学习一个新概念,都要通过编写代码来加深理解。祝您学习愉快!