zoukankan      html  css  js  c++  java
  • Android中Application类用法

    Application

    Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。

    Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。

    通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。

    启动Application时,系统会创建一个PID,即进程ID,所有的Activity都会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。

    Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以可以通过Application来进行一些,如:数据传递、数据共享和数据缓存等操作。

    应用场景:

    在Android中,可以通过继承Application类来实现应用程序级的全局变量,这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。

    实现步骤:

    1、继承Application

     1 public class CustomApplication extends Application
     2 {
     3     private static final String VALUE = "Harvey";
     4     
     5     private String value;
     6     
     7     @Override
     8     public void onCreate()
     9     {
    10         super.onCreate();
    11         setValue(VALUE); // 初始化全局变量
    12     }
    13     
    14     public void setValue(String value)
    15     {
    16         this.value = value;
    17     }
    18     
    19     public String getValue()
    20     {
    21         return value;
    22     }
    23 }

    注:继承Application类,主要重写里面的onCreate()方法(android.app.Application包的onCreate()才是真正的Android程序的入口点),就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。

    2、在ApplicationManifest.xml文件中配置自定义的Application

    1 <application
    2         android:name="CustomApplication">
    3 </application>

    实例代码:

    CustomApplication.java

     1 /**
     2  * 继承Application
     3  * 
     4  * @author admin
     5  * 
     6  */
     7 public class CustomApplication extends Application
     8 {
     9     private static final String VALUE = "Harvey";
    10     
    11     private String value;
    12     
    13     @Override
    14     public void onCreate()
    15     {
    16         super.onCreate();
    17         setValue(VALUE); // 初始化全局变量
    18     }
    19     
    20     public void setValue(String value)
    21     {
    22         this.value = value;
    23     }
    24     
    25     public String getValue()
    26     {
    27         return value;
    28     }
    29 }

    FirstActivity.java

     1 public class FirstActivity extends Activity
     2 {
     3     private CustomApplication app;
     4     
     5     @Override
     6     public void onCreate(Bundle savedInstanceState)
     7     {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.main);
    10         
    11         app = (CustomApplication) getApplication(); // 获得CustomApplication对象
    12         
    13         Log.i("FirstActivity", "初始值=====" + app.getValue()); // 获取进程中的全局变量值,看是否是初始化值
    14         
    15         app.setValue("Harvey Ren"); // 重新设置值
    16         
    17         Log.i("FirstActivity", "修改后=====" + app.getValue()); // 再次获取进程中的全局变量值,看是否被修改
    18         
    19         Intent intent = new Intent();
    20         intent.setClass(this, SecondActivity.class);
    21         startActivity(intent);
    22     }
    23 }

    注:只需要调用Context getApplicationContext或者ActivitygetApplication方法来获得一个Application对象,然后再得到相应的成员变量即可。它是代表我们的应用程序的类,使用它可以获得当前应用的主题和资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。

    SecondActivity.java

     1 public class SecondActivity extends Activity
     2 {
     3     private CustomApplication app;
     4     
     5     @Override
     6     protected void onCreate(Bundle savedInstanceState)
     7     {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.main);
    10 
    11         app = (CustomApplication) getApplication(); // 获取应用程序
    12 
    13        Log.i("SecondActivity", "当前值=====" + app.getValue()); // 获取全局值
    14     }
    15 }

    AndroidManifest.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     package="com.android.test"
     5     android:versionCode="1"
     6     android:versionName="1.0">
     7     <uses-sdk
     8         android:minSdkVersion="8" />
     9 
    10     <application
    11         android:icon="@drawable/icon"
    12         android:label="@string/app_name"
    13         android:name="CustomApplication">
    14         <!-- 将我们以前一直用的默认Application设置成自定义的CustomApplication -->
    15         <activity
    16             android:name=".FirstActivity"
    17             android:label="@string/app_name">
    18             <intent-filter>
    19                 <action
    20                     android:name="android.intent.action.MAIN" />
    21                 <category
    22                     android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24         </activity>
    25 
    26         <activity
    27             android:name=".SecondActivity"
    28             android:label="@string/app_name">
    29         </activity>
    30     </application>
    31 </manifest>

    原博文地址:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html

  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/ycxyyzw/p/3808588.html
Copyright © 2011-2022 走看看