Android开发入门系列教程

发布于:2025-09-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

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 必需工具

  1. Android Studio:官方IDE
  2. JDK:Java开发工具包(推荐JDK 11或17)
  3. 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" />

进阶学习建议

  1. 架构模式:学习MVVM、MVP等架构模式
  2. Jetpack组件:掌握ViewModel、LiveData、Room、Navigation等
  3. 性能优化:了解内存管理、布局优化、APK瘦身
  4. 测试:学习单元测试和UI测试
  5. Kotlin语言:现代Android开发推荐使用Kotlin

实战项目推荐

  1. 待办事项应用:练习数据存储和UI交互
  2. 天气应用:练习网络请求和数据展示
  3. 新闻阅读器:练习RecyclerView和Fragment
  4. 记账应用:综合运用数据库、图表展示等

调试技巧

  1. 使用Logcat
Log.d("TAG", "调试信息");
Log.e("TAG", "错误信息");
Log.i("TAG", "普通信息");
  1. 断点调试:在Android Studio中设置断点,逐步调试

  2. Layout Inspector:实时查看视图层级

  3. Profiler:监控CPU、内存、网络使用情况

总结

Android开发涉及面广,需要循序渐进地学习。建议按照以下路径:

  1. 先掌握Java/Kotlin基础
  2. 理解Android四大组件
  3. 熟悉UI开发和事件处理
  4. 学习数据存储和网络请求
  5. 掌握常用第三方库
  6. 了解架构模式和最佳实践

记住,实践是最好的学习方式。每学习一个新概念,都要通过编写代码来加深理解。祝您学习愉快!


网站公告

今日签到

点亮在社区的每一天
去签到