一、Application的生命周期
1、如果有这样的需求
资源不需要持久化,放到内存里就可以了
希望多个组件都可以访问这个数据
希望它是个可以操作的全局变量
可以使用Application这个组件
2、Application是Android的一大组件,在App运行过程中有且仅有一个Application对象贯穿整个生命周期

3、Application组件方法说明
(1)onCreate:在App启动时调用,可以在这里做准备工作
(2)onTerminate:(只在模拟环境上有效)在App终止时调用,可以在这里做善后的工作
这个接口是给Android系统开发工程师用的,不是Android应用开发工程师用
(3)onConfigurationChanged:在配置改变的时候调用,例如从竖屏变为横屏
屏幕旋转,Activity会重新创建,此时页面上表单填的内容都会消失。可以用ViewModel来解决
4、例子
MyApplication.java
java
package com.example.chapter06;
import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;
import androidx.annotation.NonNull;
public class MyApplication extends Application {
// 在App启动时调用
@Override
public void onCreate() {
super.onCreate();
Log.d("sam", "MyApplication onCreate");
}
// 在App终止时调用
@Override
public void onTerminate() {
super.onTerminate();
Log.d("sam", "MyApplication onTerminate");
}
// 在配置改变的时候调用,例如从竖屏变为横屏
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("sam", "MyApplication onConfigurationChanged");
}
}
MainActivity.java
java
package com.example.chapter06;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("sam", "MainActivity onCreate");
}
}
AndroidManifest.xml清单文件,在application标签下添加android:name=".MyApplication"
XML
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
5、日志

竖屏变成横屏

二、利用Application操作全局变量
1、Application的数据可以让Activity共享
2、Application在整个应用中只有一个实例,所以在我们自定义的时候,需要使用单例模式来写构造方法
改造MyApplication.java
java
package com.example.chapter06;
import android.app.Application;
import android.content.res.Configuration;
import android.util.Log;
import androidx.annotation.NonNull;
import java.util.HashMap;
public class MyApplication extends Application {
private static MyApplication mApp;
// 声明一个公共的信息映射对象,可当做全局变量使用
public HashMap<String, String> infoMap = new HashMap<>();
public static MyApplication getInstance() {
return mApp;
}
// 在App启动时调用
@Override
public void onCreate() {
super.onCreate();
mApp = this; // 在onCreate初始化实例
Log.d("sam", "MyApplication onCreate");
}
// 在App终止时调用
@Override
public void onTerminate() {
super.onTerminate();
Log.d("sam", "MyApplication onTerminate");
}
// 在配置改变的时候调用,例如从竖屏变为横屏
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("sam", "MyApplication onConfigurationChanged");
}
}
使用:
java
MyApplication mApp = MyApplication.getInstance();
mApp.infoMap.put("name", name);
mApp.infoMap.put("age", age);
3、适合在Application中保存的全局变量主要有下面3类数据
(1)会频繁读取的信息,如用户名、手机号等
(2)不方便由Intent传递的数据,例如:位图对象、非字符串类型的集合对象等
(3)容易因频繁分配内存而导致内存泄漏的对象,如Handler对象等
三、Room框架的导入
1、Room是谷歌官方退出的数据库处理框架,该框架同样基于SQLite,但它通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量
2、在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加两行配置,表示导入指定版本的Room库
implementation 'androidx.room:room-runtime:2.6.1'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
其中,room-runtime提供核心功能,room-compiler作为注解处理器生成代码
3、Room框架的编码步骤
以录入书籍信息为例,使用Room框架的编码过程分为下列五步
(1)编写书籍信息表对应的实体类,该类添加"@Entity"注解
(2)编写书籍信息表对应的持久化类,该类添加"@Dao"注解
(3)编写书籍信息表对应的数据库类,该类从RoomDatabase派生而来,并添加"@Database"注解
(4)在自定义的Application类中声明书籍数据库的唯一实例
(5)在操作书籍信息表的地方获取数据表的持久化对象