以下是对这些 Android 常见问题的解答:
1. Android 的数据存储方式
- SharedPreferences:轻量级键值对存储,常用于保存配置信息,如用户设置 。以 XML 文件形式存储在
/data/data/<包名>/shared_prefs
目录下。 - 文件存储:分为内部存储(应用私有,如
/data/data/<包名>/files
,无需权限,应用卸载时删除 )和外部存储(公共存储,需申请权限,如保存图片、文件等,Environment.getExternalStorageDirectory()
对应路径 )。 - SQLite 数据库:轻量级嵌入式关系型数据库,Android 提供
SQLiteOpenHelper
辅助创建和管理数据库,可存储结构化数据,如用户信息表等。 - ContentProvider:跨应用数据共享机制,可暴露自身数据给其他应用访问,也能访问系统内置(如联系人、短信)或其他应用通过 ContentProvider 共享的数据,基于Binder 实现进程间通信。
- 网络存储:将数据存储在服务器端,通过网络请求(如 HttpURLConnection、OkHttp 等)上传、下载数据,像云存储服务。
2. Service 的生命周期
- 启动式 Service(
startService()
启动 ):生命周期方法依次为onCreate()
(首次创建时调用,初始化资源 )→onStartCommand()
(每次通过startService()
调用时触发,处理业务逻辑 )→onDestroy()
(Service 销毁时调用,释放资源 )。启动后会在后台独立运行,除非调用stopService()
或自身调用stopSelf()
。 - 绑定式 Service(
bindService()
启动 ):生命周期方法为onCreate()
→onBind()
(返回 IBinder 供绑定者通信,需实现 )→ 绑定者与 Service 建立关联,当所有绑定者调用unbindService()
后,执行onUnbind()
→onDestroy()
。
3. Service 的 onStartCommand
有几种返回值
START_STICKY
:若 Service 因内存不足被系统杀死,当系统资源恢复后,会尝试重新创建 Service,且不会重新传递最后一个 Intent,适合执行周期性任务,如定时拉取数据 。START_NOT_STICKY
:Service 被杀死后,系统不会自动重启,除非有新的startService()
调用,适用于执行一次性任务,比如发送一条即时消息 。START_REDELIVER_INTENT
:Service 被杀死后,系统会重新创建 Service 并重新传递最后一个 Intent,保证 Intent 被处理,像文件上传任务,需确保任务执行完成,可使用该返回值 。START_STICKY_COMPATIBILITY
:START_STICKY
的兼容版本,行为类似但稍显不一致,一般优先用START_STICKY
。
4. Handler 防止内存泄露
- 静态内部类 + 弱引用:将
Handler
定义为静态内部类,避免因非静态内部类隐式持有外部类(如 Activity)引用,导致 Activity 销毁后无法释放。同时,在Handler
中通过弱引用持有外部类对象,使用时判空,示例:
static class MyHandler extends Handler {
private WeakReference<Activity> activityWeakReference;
public MyHandler(Activity activity) {
activityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage