安卓基础之《(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)在操作书籍信息表的地方获取数据表的持久化对象

相关推荐
李坤林20 小时前
Android Binder 详解(6) Binder 客户端的创建
android·binder
北京自在科技20 小时前
苹果iOS 26.3实现跨安卓数据无缝迁移
android·ios·findmy
_道隐_20 小时前
Android里面的layer、DisplayList和hardwarebuffer之间是什么关系
android
stevenzqzq1 天前
ctrl +B和ctrl+shift +B的区别
android·ide·android studio
似霰1 天前
HIDL Hal 开发笔记5----Same-Process HALs 实例分析
android·framework·hal
robotx1 天前
安卓16 设置壁纸中应用网格,有两个5X5的选项
android
Yyuanyuxin1 天前
保姆级学习开发安卓手机软件(三)--安装模拟机并开始简单的进入开发
android·学习
Android小码家1 天前
llama.cpp+Android应用定制
android·llama
龚礼鹏1 天前
Android应用程序 c/c++ 崩溃排查流程二——AddressSanitizer工具使用
android·c语言·c++