• 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 }
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/codingblock/p/4756243.html
Copyright © 2020-2023  润新知