一、Android四大组件精要
1. Activity
-
生命周期:
onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()
- 重点场景:
- 屏幕旋转:
onSaveInstanceState()
保存临时数据 - 返回栈管理:
launchMode
(standard/singleTop/singleTask/singleInstance)
- 屏幕旋转:
- 重点场景:
-
页面跳转:
Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.putExtra("key", value); // 传参 startActivityForResult(intent, REQUEST_CODE); // 需要回调时使用
2. Service
- 类型:
- 前台服务:必须显示通知(Android 8.0+要求)
- 绑定服务:通过
bindService()
实现组件与服务通信
- 代码模板:
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return new LocalBinder(); // 实现跨进程通信 } }
3. BroadcastReceiver
- 动态注册:
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); registerReceiver(receiver, filter); // 需在onDestroy()中unregister
- 静态注册:AndroidManifest.xml声明(系统广播限制)
4. ContentProvider
- 数据共享:
Uri uri = Uri.parse("content://com.example.provider/table1"); Cursor cursor = getContentResolver().query(uri, null, null, null, null);
二、UI开发核心技能
1. 布局优化
- 性能技巧:
- 使用
<merge>
标签减少布局层级 ConstraintLayout
替代多层嵌套- 用
<include>
复用布局
- 使用
- 测量工具:
- Android Studio的 Layout Inspector
Debug GPU Overdraw
(检测过度绘制)
2. RecyclerView高级用法
- 万能Adapter模板:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { // 使用DiffUtil更新数据 private final DiffUtil.ItemCallback<Item> diffCallback = new DiffUtil.ItemCallback<Item>() { @Override public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) { return oldItem.getId() == newItem.getId(); } @Override public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) { return oldItem.equals(newItem); } }; private final AsyncListDiffer<Item> differ = new AsyncListDiffer<>(this, diffCallback); // ... 其他实现 }
3. 自定义View三部曲
- 测量:重写
onMeasure()
,计算View大小 - 布局:重写
onLayout()
(ViewGroup需要) - 绘制:重写
onDraw()
,使用Canvas绘制
- 性能要点:
- 避免在
onDraw()
中创建对象 - 使用
invalidate()
局部刷新
- 避免在
三、数据持久化方案
1. Room数据库进阶
- 关联查询:
@Query("SELECT * FROM user INNER JOIN book ON user.id = book.user_id") public List<UserWithBooks> getUsersWithBooks();
- 类型转换器:
@TypeConverter public static Date fromTimestamp(Long value) { return value == null ? null : new Date(value); }
2. SharedPreferences陷阱
- 正确用法:
// 使用apply()替代commit()(异步写入) SharedPreferences.Editor editor = prefs.edit(); editor.putString("key", "value"); editor.apply();
- 替代方案:Jetpack DataStore
四、现代架构模式(MVVM)
1. ViewModel + LiveData
- 代码结构:
public class MyViewModel extends ViewModel { private MutableLiveData<List<String>> data = new MutableLiveData<>(); public LiveData<List<String>> getData() { if (data.getValue() == null) { loadData(); } return data; } private void loadData() { // 异步加载数据 } }
2. 数据绑定优化
- 布局文件:
<layout> <data> <variable name="viewModel" type="com.example.MyViewModel" /> </data> <TextView android:text="@{viewModel.userName}" android:onClick="@{() -> viewModel.onClick()}" /> </layout>
五、调试与性能调优
1. 内存泄漏检测
- LeakCanary集成:
dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1' }
- 常见泄漏场景:
- 非静态内部类持有Activity引用
- 未取消的RxJava订阅
2. Profiler使用技巧
- CPU Profiler:追踪方法耗时
- Memory Profiler:检测内存抖动
- Network Profiler:优化API请求
六、必备工具清单
工具类型 | 推荐工具 | 用途 |
---|---|---|
调试工具 | Stetho、ADB | 网络请求监控/数据库导出 |
性能优化 | Systrace、Android Profiler | 卡顿分析/内存泄漏检测 |
开发效率 | Postman、JSON Viewer | API调试/数据结构可视化 |
版本管理 | Git + GitKraken | 代码版本控制 |
七、避坑指南(血泪经验)
-
ANR预防:
- 主线程禁止网络请求/复杂计算
- 使用
StrictMode
检测违规操作
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().penaltyLog().build());
-
版本兼容:
- 使用
ContextCompat.checkSelfPermission()
处理权限 WebView
加载需配置WebView.setWebContentsDebuggingEnabled(true)
- 使用
-
Proguard混淆:
- 保留实体类:
-keep class com.example.model.** { *; }
- 保留注解:
-keepattributes *Annotation*
- 保留实体类: