全局变量

C/C++有所谓的全局变量,因为全局变量保存在内存中,所以操作全局变量就是操作内存,其速度远比操作数据库或者操作文件快得多,而且工程里的任何代码都可以引用全局变量,因此很多时候全局变量是共享数据和消息传递的好帮手。不过Java没有全局变量的概念,与之比较接近的东西,是类里面的静态成员变量;该变量可被外部直接引用,并且在不同地方引用的值都是一样的(前提是在引用期间不能修改该变量的值)。所以我们可以借助静态成员变量来实现全局变量的功能。

Application组件

Application是比Activity高级的组件,它的生命周期覆盖了APP运行的全过程;而Activity页面的生命周期很短暂,只要进入别的页面,原页面就被停止或者销毁;因此我们可以在Application中保存全局变量。在打开App时,系统会先初始化Application,然后才进入到开始的Activity页面。通常我们不需要指定一个Application,这时系统会自动帮我们创建,如果需要创建自己的Application,创建一个派生自Application的类,并在manifest的application标签中注册就好了。

适合在Application中保存的全局变量,主要是一些Activity不方便传输的对象,包括:
1、Java容器类和需要使用方法的对象;因为Intent不能直接传递容器数据,同时序列化对象只能传输数据却不能传输方法。
2、多个Activity都要使用的数据,比如说电商APP的用户信息,既不方便在每次Activity跳转时都传递用户数据,也不方便在每个Activity页面频繁查询用户数据库,所以这种数据也适合作为全局变量由Application管理。
3、容易因频繁分配内存而导致内存泄漏的对象,如Handler对象。

Application内存读写的实现思路

首先写一个类MainApplication继承自Application,该类要采用单例模式,内部声明自身类的一个静态成员对象,在创建app时把自身赋值给这个静态对象,然后提供一个静态对象的获取方法。

其次在每个Activity中声明MainApplication类的成员对象,同时获取MainApplication的静态对象赋值给该成员对象,于是每个Activity都持有了MainApplication的唯一实例,保证它们操作的都是同一套东西。

接着在具体Activity中,就可以通过该成员对象访问MainApplication内部的公共对象和公共方法了。

最后不要忘了在AndroidManifest.xml中注册新定义的Application类名,即在application节点中增加android:name属性。Android工程默认没有该属性,如果不设置该属性,系统会启用默认的Application,当然此时我们就无法实现全局变量了。

下面是具体的代码例子
MainApplication的代码

import java.util.HashMap;
import java.util.Map;import android.app.Application;public class MainApplication extends Application {private static MainApplication mApp;public HashMap<String, String> mMap = new HashMap<String, String>();public static MainApplication getInstance() {return mApp;}@Overridepublic void onCreate() {super.onCreate();mApp = this;}public String getMapDesc() {String desc = "键值对信息如下:\n";for (Map.Entry<String, String> item_map : mMap.entrySet()) {desc = String.format("%s字段名称:%s,字段值:%s\n", desc, item_map.getKey(), item_map.getValue());}return desc;}}

主页面的代码

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private MainApplication mApp = MainApplication.getInstance();private EditText et_key, et_value;private TextView tv_desc;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_key = (EditText) findViewById(R.id.et_key_main);et_value = (EditText) findViewById(R.id.et_value_main);tv_desc = (TextView) findViewById(R.id.tv_desc_main);Button btn_save = (Button) findViewById(R.id.btn_save);Button btn_first = (Button) findViewById(R.id.btn_first);Button btn_second = (Button) findViewById(R.id.btn_second);btn_save.setOnClickListener(this);btn_first.setOnClickListener(this);btn_second.setOnClickListener(this);}@Overrideprotected void onStart() {super.onStart();tv_desc.setText(mApp.getMapDesc());}@Overridepublic void onClick(View v) {if (v.getId() == R.id.btn_save) {if (et_key.getText()==null || et_key.getText().length()<=0) {Toast.makeText(this, "请输入字段名称", Toast.LENGTH_LONG).show();return;} else if (et_value.getText()==null || et_value.getText().length()<=0) {Toast.makeText(this, "请输入字段值", Toast.LENGTH_LONG).show();return;}mApp.mMap.put(et_key.getText().toString(), et_value.getText().toString());tv_desc.setText(mApp.getMapDesc());} else if (v.getId() == R.id.btn_first) {Intent intent = new Intent(this, FirstActivity.class);startActivity(intent);} else if (v.getId() == R.id.btn_second) {Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);}}}

两个子页面的代码参照主页面代码,就不重复帖了

下面是使用Application完成内存读写的效果图

点击下载本文用到的Application内存读取的工程代码

点此查看Android开发笔记的完整目录

Android开发笔记(二十八)利用Application实现内存读写相关推荐

  1. Android开发笔记(十八)书籍翻页动画PageAnimation

    前面几节的动画都算简单,本文就介绍一个复杂点的动画--书籍翻页动画.Android有自带的翻页动画ViewPager,不过ViewPager只实现了平移效果.即便使用补间组合动画或者属性动画,也只是把 ...

  2. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  3. Android开发笔记(十二)测量尺寸与下拉刷新

    尺寸测量的配置 控件宽和高的设置方式 大家知道,自定义视图的目的就是要在屏幕上显示期望的图案,那在绘制图案之前,我们得先知道这个图案的尺寸(如宽多少高多少). 一般在xml中给控件的宽和高有三种赋值方 ...

  4. Android开发笔记(一百八十七)利用估值器实现弹幕动画

    如今上网看电影电视越发流行了,追剧的时候经常看到视频上方数行评论向左边飘去,犹如子弹那样飞快掠过,这些评论文字因此得名"弹幕".弹幕评论由正在观看的网友们即兴发表,故而连绵不绝从画 ...

  5. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  6. Android开发笔记(九十八)往图片添加部件

    添加圆角 添加圆角的功能,要用到Canvas类的drawRoundRect方法,即把画布裁剪成指定的圆角矩形. 下面是给图片添加圆角的效果截图: 下面是给图片添加圆角的代码片段: public sta ...

  7. Android开发笔记(十五)淡入淡出动画TransitionDrawable

    说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换.如果我们想要从A图片逐渐变为B图片,也就是要实 ...

  8. Android开发笔记(十九)底部标签栏TabBar

    底部标签页实现思路 现在的APP,大多在页面底部显示标签栏Tabbar,用于切换不同栏目的页面.Tabbar起源于iOS,iOS的Tabbar自动位于页面下方,可是Android搬过来的时候做了改动, ...

  9. Android开发笔记(十六)秋千摇摆动画SwingAnimation

    上节博主介绍了AlphaAnimation和淡入淡出动画的使用,其实AlphaAnimation只是四种补间动画中的一种.那么为了加深对其他补间动画的理解,我想说说旋转动画RotateAnimatio ...

最新文章

  1. CSS Selector 3
  2. 一文掌握明年物联网传感器市场!2022中国AIoT产业全景图谱报告新鲜出炉
  3. vssver2.scc 文件是干啥的?
  4. 【转载】设计模式_六大原则(学习)
  5. 直播 | 旷视研究院最新理论成果:批归一化和权重衰减的球面优化机制
  6. 【Linux系统编程】进程内存模型
  7. 字典常用的方法(内建函数)
  8. P4389-付公主的背包【生成函数,多项式exp】
  9. 前端学习(2537):vue源码解析2伪数组转换为真数组
  10. java设置界面边框,技术员教你解决Java 添加Word页面边框
  11. 爱加密和梆梆加固的破解方法
  12. MPI 初认识 (入门教程)
  13. word文件损坏打不开如何修复?
  14. 2022智源大会议程公开 | 青源学术年会
  15. 基于C#实现的《勇士返乡》游戏设计
  16. MATLAB——textscan
  17. AppStore 审核指南
  18. Tomcat在指定JDK版本启动
  19. 企鲸客SCRM免费赠送企业微信考勤机
  20. Docker:MacOS环境下修改容器的端口号

热门文章

  1. 吴恩达机器学习 4.逻辑回归(Logistic Regression)
  2. ubuntu安装teamviewer教程 linux安装teamviewer教程
  3. innobackupex参数之 --throttle 限速这个值设置多少合理 原创
  4. python接口自动化(四十四)- 公共模块configparser读取ini数据库、邮箱配置文件(单独说明)
  5. java 线程_理解java多线程
  6. CentOS7安装Redis,全网最快安装教程
  7. Visual Studio 编写纯C语言程序
  8. Socket 实例之透析java,C#的互操作
  9. java quickfix_QuickFix Java 讲解(三)客户端的搭建与解析
  10. java oracle数据备份_Java后台备份oracle数据库脚本