Android学习笔记

一、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三部曲
  1. 测量:重写onMeasure(),计算View大小
  2. 布局:重写onLayout()(ViewGroup需要)
  3. 绘制:重写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 ViewerAPI调试/数据结构可视化
版本管理Git + GitKraken代码版本控制

七、避坑指南(血泪经验)

  1. ANR预防

    • 主线程禁止网络请求/复杂计算
    • 使用StrictMode检测违规操作
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads().detectDiskWrites().penaltyLog().build());
    
  2. 版本兼容

    • 使用ContextCompat.checkSelfPermission()处理权限
    • WebView加载需配置WebView.setWebContentsDebuggingEnabled(true)
  3. Proguard混淆

    • 保留实体类:-keep class com.example.model.** { *; }
    • 保留注解:-keepattributes *Annotation*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值