安卓基础之《(14)—数据存储(4)应用组件Application》

一、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)在操作书籍信息表的地方获取数据表的持久化对象

相关推荐
Digitally2 小时前
2026 年 8 款安卓数据擦除软件和应用对比
android
杨忆2 小时前
android 11以上 截图工具类
android
粤M温同学2 小时前
Android Studio 中安装 CodeBuddy AI助手
android·ide·android studio
阿拉斯攀登3 小时前
【RK3576 安卓 JNI/NDK 系列 08】RK3576 实战(二):JNI 调用 I2C 驱动读取传感器数据
android·安卓ndk入门·jni方法签名·java调用c++·rk3576底层开发·rk3576 i2c开发
赶路人儿5 小时前
常见的mcp配置
android·adb
符哥20085 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
没有了遇见6 小时前
Android 项目架构之<用户信息模块>
android
Georgewu7 小时前
如何判断应用在鸿蒙卓易通或者出境易环境下?
android·harmonyos
localbob8 小时前
Pico 4XVR 1.10.13安装包下载与安装教程 ico 4XVR最新版下载、4XVR 1.10.13 APK安装包、Pico VR看电影软件、4XVR完整版安装教程、Pico 4播放器推荐、V
android·vr·vr播放器·vr眼镜播放器下载·pico 4xvr·4xvr下载·pico 4xvr最新版安装包
峥嵘life8 小时前
Android16 EDLA【CTS】CtsConnectivityMultiDevicesTestCases存在fail项
android·学习