专栏首页CodingBlockAndroid学习笔记(三)Application类简介

Android学习笔记(三)Application类简介

  每次运行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 </application>

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

1   MyApplication myApp = MyApplication.getInstance();//获取Application类实例化对象
2   myApp.setTest("测试数据");//更改状态变量
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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android学习笔记(一)Android应用程序的组成部分

      Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起;应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定...

    codingblock
  • Android学习笔记(二)Manifest文件节点详解

      在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文...

    codingblock
  • Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

    上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas...

    codingblock
  • pytest文档18-配置文件pytest.ini

    pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行。

    上海-悠悠
  • 用高仿面具试验人脸识别系统,微信、支付宝、机场安检统统被骗

    面部识别技术已被广泛视为一种安全工具,政府和公司等都在广泛使用,但事实证明,这项技术并不可靠。人工智能公司Kneron的研究人员周四表示,他们能够使用一张高仿真...

    AiTechYun
  • python3 paramiko 基于RSA私钥远程执行ssh、上传、下载文件

    paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令。

    Devops海洋的渔夫
  • Kali Linux Web渗透测试手册(第二版) - 3.10 - 从爬行结果中识别相关文件和目录

    thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt,

    7089bAt@PowerLi
  • CSS检查工具-CKStyle

    HTML5学堂:CSS代码存在压缩工具、检查工具以及重排属性的工具。今天推荐给大家CKStyle这个工具,顺便也来看看其他的一些工具。 各类CSS检查工具 首先...

    HTML5学堂
  • 初识SQL Server2017 图数据库(一)

    背景:   图数据库对于表现和遍历复杂的实体之间关系是很有效果的。而这些在传统的关系型数据库中尤其是对于报表而言很难实现。如果把传统关系型数据库比做火车的话,那...

    用户1217611
  • VB.NET 网抓技巧分享(有道翻译为例)

    网抓重要就是要了解,浏览器以那种方式向服务器请求数据(post或者get常用方式)和向服务器发送了什么请求,这请求包括:头文件,请求类型,请求目标数据等等!本编...

    巴西_prince

扫码关注云+社区

领取腾讯云代金券