Android笔记——Application的做用

1、Application是什么

      Application和Actovotu,Service同样是android框架的一个系统组件,当android程序启动时系统会建立一个 application对象,用来存储系统的一些信息。一般咱们是不须要指定一个Application的,这时系统会自动帮咱们建立,若是须要建立本身 的Application,也很简单建立一个类继承 Application并在manifest的application标签中进行注册(只须要给Application标签增长个name属性把本身的 Application的名字定入便可)。java

      android系统会为每一个程序运行时建立一个Application类的对象且仅建立一个,因此Application能够说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。由于它是全局 的单例的,因此在不一样的Activity,Service中得到的对象都是同一个对象。因此经过Application来进行一些,数据传递数据共享 ,数据缓存等操做。android

2、Application 配置全局Context

第一步、写一个全局的单例模式的MyApplication继承自Application 覆盖onCreate ,在这个方法里面实例化Application缓存

第二步、配置全局的Context网络

<application Android:name="com.appstore.service.MyApplication" ></application>app

第三步、使用,使用的时候用的时候根据类的名称访问Context框架

3、Android程序的入口点

       其实在android.app.Application这个包的onCreate才是真正的Android入口点,只不过大多数开发者无需重写该类,他的继承关系以下图:ide

java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Application网站

android.app.Application类包含了4个公开的方法this

void  onConfigurationChanged(Configuration newConfig)
void  onCreate()  //这里才是真正的入口点。
void  onLowMemory()
void  onTerminate()spa

       因此但愿你们,记住真正的Android入口点是application的main,你能够看下androidmanifest.xml的包含关系就清楚了,并非每一个应用都必须有Activity的。

4、重写 Application 类的生命周期事件

      public  void  onCreate() 

   在应用程序建立的时候被调用,能够实现这个这个方法来建立和实例化任何应用程序状态变量或共享资源。还能够在这个方法里面获得 Application 的单例

 

  public void onTerminate ()

  当终止应用程序对象时调用,不保证必定被调用当程序是被内核终止以便为其余应用程序释放资源,那么将不会提醒而且不调用应用程序的对象的onTerminate方法而直接终止进程。

 

  public  void onLowMemory()  

  当系统资源匮乏的时候,咱们能够在这里能够释放额外的内存, 这个方法通常只会在后台进程已经结束,但前台应用程序仍是缺乏内存时调用。能够重写这个方法来清空缓存或者释放没必要要的资源

 

  public  void  onTrimMemory(int level) 

  当运行时决定当前应用程序应该减小其内存开销时(一般在进入后台运行的时候)调用,包含一个 level 参数,用于提供请求的上下文。

 

  public void onConfigurationChanged (Configuration newConfig)

  与 Activity 不一样,配置改变时,应用程序对象不会被终止和重启。若是应用程序使用的值依赖于特定的配置,则重写这个方法来加载这些值,或者在应用程序级处理配置值的改变。

5、数据传递    

      假若有一个Activity A, 跳转到 Activity B ,并须要传递一些数据,一般的做法是 Intent.putExtra() 让Intent携带,或者有一个Bundle把信息加入Bundle让Intent传递Bundle对象,实现传递。但这样有一个问题在于,Intent 和 Bundle 所能携带的数据类型都是一些基本的数据类型,若是想实现复杂的数据传递就比较麻烦了,一般须要实现 Serializable 或者 Parcellable 接口。这实际上是Android的一种IPC数据传递的方法。若是咱们的两个Activity在同一个进程当中为何还要这么麻烦呢,只要把须要传递的对象的引用传递过去就能够了。

  基本思路是:在 Application 中建立一个 HashMap ,以字符串为key,Object为value这样咱们的 HashMap 就能够存储任何类型的对象了。在Activity A中把须要传递的对象放入这个HashMap,而后经过 Intent 或者其它途径再把这 key 传递给Activity B ,Activity B 就能够根据这个字符串在 HashMap 中取出这个对象了。只要再向下转型 ,就实现了对象的传递。

6、数据共享

      定义两个Activity:  MainActivity.java 和 MainActivity2.java, 代码是同样的

 1 TextView tv;
 2 EditText et;
 3 
 4 @Override
 5 protected void onCreate(Bundle savedInstanceState) {
 6     super.onCreate(savedInstanceState);
 7     //setContentView(R.layout.activity_main_activity2);
 8     setContentView(R.layout.activity_main2);
 9 
10     tv = (TextView) findViewById(R.id.tv);
11     et = (EditText) findViewById(R.id.et);
12     
13     tv.setText("共享数据:" + getApp().getTextData());
14     
15     findViewById(R.id.btnTextData).setOnClickListener(new OnClickListener() {
16         @Override
17         public void onClick(View v) {
18             getApp().setTextData(et.getText().toString());
19             tv.setText("共享数据:" + et.getText().toString());
20         }
21     });
22 }
23 
24 public App getApp() {
25     return ((App)getApplicationContext());
26 }

      定义一个类App,集成Application

 1 public class App extends Application {
 2     
 3     private String textData = "default";
 4     
 5     public void setTextData(String textData) {
 6         this.textData = textData;
 7     }
 8     public String getTextData() {
 9         return textData;
10     }
11 }

      修改AndroidManifest.xml文件, 使用自定义的Application,两个Activity都是入口:

 1 <application
 2     android:name="com.carloz.learnapplication.App"
 3     android:allowBackup="true"
 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     <activity
17         android:name="com.carloz.learnapplication.MainActivity2"
18         android:label="@string/title_activity_main_activity2" >
19         <intent-filter>
20             <action android:name="android.intent.action.MAIN" />
21 
22             <category android:name="android.intent.category.LAUNCHER" />
23         </intent-filter>
24     </activity>
25 </application>

     结果,在一个Activity修改App的数据,在另外一个Activity都能获取到

7、数据缓存

    在 Application 中创建两个 HashMap 一个用于数据的传递,一个用于缓存一些数据。好比有一个Activity须要从网站获取一些数据,获取完以后咱们就能够把这个数据先存到Application 当中,当页面跳转到其它 Activity 再回来的时候,就能够直接使用缓存好的数据了。但若是须要cache一些大量的数据,最好是cache一些 (软引用)SoftReference ,并把这些数据cache到本地Rom 上或者 SDCard上。若是在 Application 中的缓存不存在,从本地缓存查找,若是本地缓存的数据也不存在再从网络上获取。

相关文章
相关标签/搜索