zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    JVM内存区域与内存溢出异常
    蓄水池抽样算法应用
    InnoDB引擎的索引和存储结构
    ASP.NET Core Web API 集成测试中使用 Bearer Token
    ASP.NET Core Web API 集成测试
    测试 ASP.NET Core API Controller
    使用 coverlet 查看.NET Core应用的测试覆盖率
    使用 Moq 测试.NET Core 应用 -- 其它
    使用 Moq 测试.NET Core 应用 -- Mock 行为
    使用 Moq 测试.NET Core 应用 -- Mock 属性
  • 原文地址:https://www.cnblogs.com/codingblock/p/4756243.html
Copyright © 2011-2022 走看看