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

相关推荐
程序员清洒11 分钟前
Flutter for OpenHarmony:GridView — 网格布局实现
android·前端·学习·flutter·华为
running up that hill1 小时前
Android的线性布局
android
m0_748229991 小时前
Laravel9.x核心特性全解析
android
2603_949462103 小时前
Flutter for OpenHarmony社团管理App实战:意见反馈实现
android·flutter
错把套路当深情4 小时前
android两种渠道支持一键打包 + 随意组合各种渠道
android
彬sir哥5 小时前
android studio如何把.gradle从C盘移到D盘
android·gradle·maven·android studio
、BeYourself6 小时前
TabLayout 与 ViewPager2 的基本使用
android·android-studio
南村群童欺我老无力.6 小时前
Flutter 框架跨平台鸿蒙开发 - 城市文创打卡:探索城市文化创意之旅
android·flutter·华为·harmonyos
Madison-No77 小时前
【Linux】文件操作&&重定向原理
android·linux·运维
2603_949462107 小时前
Flutter for OpenHarmony社团管理App实战:消息中心实现
android·javascript·flutter