每次运行APP时,Application类都保持实例化状态。与Activity不同,配置改变不会导致应用程序重启。通过继承Application类,可以完成一下3项工作:

  · 对Android运行时广播的应用程序级事件做出相应。

  · 在应用程序组件之间传递对象。

  · 管理和维护多个应用程序组件使用的资源。

  其中,后两项工作通过使用一个单态类能够更好地完成。Application的实现在本质上是单态的,并应作为单态实现,以便提供对其方法和成员变量的访问。

一、扩展和使用Application类

  如下程序是扩展了Application类的框架代码,并把它实现为一个单态。

  1. public class MyApplication extends Application {
  2. private static MyApplication singleton;
  3.  
  4. public static MyApplication getInstance(){
  5. return singleton;
  6. }
  7.  
  8. @Override
  9. public final void onCreate() {
  10. super.onCreate();
  11. singleton = this;
  12. }
  13. }

  需要注意的是,在创建新的Application类后,需要在Manifest的application节点中注册它,如下所示:

  1. <application
  2. android:allowBackup="true"
  3. android:name=".MyApplication"
  4. android:icon="@drawable/ic_launcher"
  5. android:label="@string/app_name"
  6. android:theme="@style/AppTheme" >
  7. <activity
  8. android:name=".MainActivity"
  9. android:label="@string/app_name" >
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12.  
  13. <category android:name="android.intent.category.LAUNCHER" />
  14. </intent-filter>
  15. </activity>
  16. 16 </application>

  当应用程序开始运行时,Application实现将会得到实例化。创建新的状态变量和全局资源,在程序中我们可以通过以下方式使用它:

  1.   MyApplication myApp = MyApplication.getInstance();//获取Application类实例化对象
  2. 2   myApp.setTest("测试数据");//更改状态变量
  3. 3   String test = myApp.getTest();//获取状态变量

  我们知道,在Activity传递变量的方式有很多种,(如:Intent传参),但就像有些常用的状态变量(如:用户的userId),如果每次得通过Intent方式传来传去的话,很容易导致逻辑混乱,那么这时候我们就可以将这个常用的公共变量保存到Application类中,无论哪一个Activity需要用到它时,直接从Application类中获取即可,非常方便。下面以一个简单的例子来说明一下通过Application类达到共享变量的效果:

  示例说明:创建两个Activity,用其中的一个Activity改变Application中的变量,然后在另一个Activity中验证此变量的改变。(例子很简单,能说明问题即可)先看一下效果图:

     

  1、首先创建MyApplication去继承Application类

  1. public class MyApplication extends Application {
  2. private static MyApplication singleton;
  3. private String test;
  4. public static MyApplication getInstance(){
  5. return singleton;
  6. }
  7. public String getTest() {
  8. return test;
  9. }
  10. public void setTest(String test) {
  11. this.test = test;
  12. }
  13. @Override
  14. public final void onCreate() {
  15. super.onCreate();
  16. singleton = this;
  17. }
  18. }

  以上代码,在MyApplication类中,包含了一个MyApplication的实例变量和一个测试变量。

  2、在MainActivity中获取MyApplication的实例化对象,并且改变MyApplication中test变量的值。

  1. public class MainActivity extends Activity {
  2. private MyApplication myApp;
  3. EditText etTest;
  4. Button bnGo;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. myApp = MyApplication.getInstance();//获取Application类实例化对象
  10. etTest = (EditText)findViewById(R.id.et_test);//绑定控件
  11. bnGo = (Button)findViewById(R.id.bn_go);//绑定控件
  12. bnGo.setOnClickListener(new OnClickListener() {
  13. @Override
  14. public void onClick(View arg0) {
  15. myApp.setTest(etTest.getText().toString());//改变MyApplication中test变量的值
  16. Intent intent = new Intent(MainActivity.this, TestActivity.class);
  17. startActivity(intent);
  18. }
  19. });
  20. }
  21. }

  3、在TestActivity取出MyApplication中的test值并显示在TextView上。

  1. public class TestActivity extends Activity {
  2. private String test;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_test);
  7. TextView tvShow = (TextView)findViewById(R.id.tv_show);
  8. test = MyApplication.getInstance().getTest();
  9. tvShow.setText(test);
  10. }
  11. }

二、重写应用程序的生命周期事件

  Application类为应用程序的创建和终止,低可用内存和配置改变提供了事件处理程序。

  通过重写一下方法,可以为上述几种情况实现自己的应用程序行为:

  · onCreate 创建应用程序时调用。可通过重写此方法来实例化应用程序的单态,以及创建和实例化任何应用程序的状态变量和共享资源。

  · onLowMemory: 当系统处于资源匮乏状态是,具有良好行为的应用程序可以释放额外的内存。此方法一般只会在后台进程已经终止,但是前台应用程序仍然缺少内存是调用。可通过重写此方法来清空缓存或者释放不必要的资源。

  · onTrimMemory:作为onLowMemory的一个特定于应用程序的替代选择,在Android 4.0(API level 13)中引入。

  · onConfigurationChanged:在配置改变时,应用程序对象不会被终止和重启。如果应用程序使用到的值需要在配置改变时重新加载,则可以通过重写此方法实现。

  以下是重写什么周期事件的代码(没有实现具体功能):

  1. public class MyApplication extends Application {
  2. private static MyApplication singleton;
  3. public static MyApplication getInstance(){
  4. return singleton;
  5. }
  6.  
  7. @Override
  8. public final void onCreate() {
  9. super.onCreate();
  10. singleton = this;
  11. }
  12.  
  13. @Override
  14. public final void onLowMemory() {
  15. super.onLowMemory();
  16. }
  17.  
  18. @Override
  19. public void onTrimMemory(int level) {
  20. //此方法在Android 4.0(API level 13)中引入,使用时请注意。
  21. super.onTrimMemory(level);
  22. }
  23.  
  24. @Override
  25. public void onConfigurationChanged(Configuration newConfig) {
  26. super.onConfigurationChanged(newConfig);
  27. }
  28. }

Android学习笔记(三)Application类简介的更多相关文章

  1. [Android学习笔记]扩展application

    扩展Application对象 每一个应用程序启动之后,都会分配一个linux用户,并且运行在一个独立的进程中.默认情况下,一个应用程序只会运行在一个进程中(可以通过配置android:process ...

  2. android学习笔记三

    GUI==>Graphics User Interface,图形用户界面. android UI 建立在View.ViewGroup基础上,采用组合器设计模式设计View和ViewGoup. V ...

  3. MyBatis学习笔记(三) Configuration类

    一.初探Configuration类 我们先来看一下MyBatis的XML配置文件的结构,(摘自mybatis.org) 下面这个是Configuration类的部分变量 一点不一样是不是??? 其实 ...

  4. Android学习笔记三:用Intent串联activity

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513399.html 一:Intent Intent可以理解为 意图. 我们可以通过创建intent实例来定义 ...

  5. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  6. Android学习笔记(三)

    ContentProvider简单介绍 ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序须要把自己的数据暴露给其它程序使用时.该应用程序便可通过提供Conten ...

  7. JVM学习笔记(三):类文件结构

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 实现语言无关性的基础是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,只与&quo ...

  8. IDA Pro 权威指南学习笔记(三) - IDA 桌面简介

    IDA 的默认桌面如下图 工具栏区域(1)包含与 IDA 的常用操作对应的工具,可以使用 View -> Toolbar 显示或隐藏工具栏 可以使用 View -> Toolbars -& ...

  9. android学习笔记三--Activity 布局

    1.线性布局 标签 :<LinearLayout></LinearLayout> 方向:android:orientation, 垂直:vertical 水平:Horizont ...

  10. Android学习笔记(8):ViewGroup类

    A ViewGroup is a special view that can contain other views (called children.) The view group is the  ...

随机推荐

  1. C# DbHelperSQLite,SQLite数据库帮助类 (转载)

    主要功能如下数据访问抽象基础类 主要是访问SQLite数据库主要实现如下功能 .数据访问基础类(基于SQLite),主要是用来访问SQLite数据库的. .得到最大值:是否存在:是否存在(基于SQLi ...

  2. CSS 列表

    CSS列表属性作用如下: 设置不同的列表项标记为有序列表 设置不同的列表项标记为无序列表 设置列表项标记为图像 列表 在HTML中,有两种类型的列表: 无序列表 - 列表项标记用特殊图形(如小黑点.小 ...

  3. 使用ArrayList对大小写字母的随机打印

    从a~z以及A~Z随机生成一个字母并打印:打印全部的字母 package com.liaojianya.chapter1; import java.util.ArrayList; /** * This ...

  4. [LeetCode OJ] Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  5. 浅谈PHP神盾的解密过程

    我们来做第一步解密处理吧. PS: 这只是我的解密思路,与大家分享一下,也许你有更好的方法还望分享 <?php $str = file_get_contents("1.php" ...

  6. centos下配置多个tomcat同时运行

    首先安装好jdk,下载好tomcat,我的是apache-tomcat-7.0.50,不用专门配置CATALINA_2_BASE,CATALINA_2_HOME等环境变量. 把tomcat解压到lin ...

  7. JavaScript Ajax + Promise

    AJAX 在现代浏览器上写AJAX主要依靠XMLHttpRequest对象: function success(text) { var textarea = document.getElementBy ...

  8. 我也来玩玩WinForm~BeginInvoke让用户体验更好!

    前言 先说明一下,本人不太做winform的项目,工作10年以来,一直奋斗在webform的舞台上,今天有机会也接触了一下winform,下面对工作中用到的BeginInvoke方法作一下说明,和大家 ...

  9. 桂电在线-php-提取菜单到配置文件

    新建存储菜单的配置文件 menus.php,并配置菜单 <?php if ( ! defined('BASEPATH')) exit('No direct script access allow ...

  10. PHP开发APP接口---返回数据的封装类

    参考视频http://www.imooc.com/learn/163 <?php /** * app返回数据类 * 1.接受多维,缺少键名的数组, * 2.可由输入的format参数决定返回数据 ...