標籤:application 代碼最佳化
影子模仿術——鹿丸的絕招
奈良一族密傳的忍術,藉由伸長自己的影子來與敵方的連結,使對方作出和自己相同動作的奇特忍術。
其實對於安卓來說,入口並不是activity的Oncreate,而是aplication 大家可以看看設定檔,最先的並不是activity。
其實我第一次看怎麼使用aplication的時候,總覺得有點像單例模式,或者是說,aplication就是拿著單例的原理 造就了他的特性嗎?
他就像影子模仿術一樣,它裡面存放著全域變數,不管是誰,只要是他的子類,只要在一個進程,都可以共用一個值。
官方解釋:
android.app.Application類和Activity,Service一樣是Android架構的一個系統組件,當Android程式啟動時系統會建立一個Application對象,用來儲存系統的一些資訊。
Android系統自動會為每個程式運行時建立一個Application類的對象且只建立一個,所以Application可以說是單例(singleton)模式的一個類。 |
啟動Application時,系統會建立一個PID,即進程ID,所有的Activity都會在此進程上運行。那麼我們在Application建立的時候初始化全域變數,同一個應用的所有Activity都可以取到這些全域變數的值,換句話說,我們在某一個Activity中改變了這些全域變數的值,那麼在同一個應用的其他Activity中值就會改變。Application對象的生命週期是整個程式中最長的,它的生命週期就等於這個程式的生命週期。因為它是全域的單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。因此可以通過Application來進行一些,如:資料傳遞、資料共用和資料緩衝等操作。
好了 開始正題:
首先建立一個類, MyApp類,繼承Application
package com.example.aplicationdemo;import android.app.Application;import android.util.Log;/** * * *整個應用的內容物件 */public class MyApp extends Application{ private static final MyApp instance = new MyApp(); /** * 全域變數 */ private String name = "JDK"; /* * android應用程式真正入口。 * 此方法在所有activity,servie,receiver組件之前調用 * */ @Override public void onCreate() { super.onCreate();//必須調用父類方法 Log.i("CREATE","application created...."); } /** * 此方法方便在那些沒有context對象的類中使用 * @return MyApp執行個體 */ public static MyApp getApplicationInstance() { return instance; } /* setter/getter 方法 */ public String getName() { return name; } public void setName(String name) { this.name = name; } }
其中getset方法是給你提供修改值用的
注意的是 建完myapp類以後再 設定檔 註冊下 在aplication下加一個name屬性即可
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:name="com.example.aplicationdemo.MyApp" android:label="@string/app_name" android:theme="@style/AppTheme" >
2.接著我們在MainActivity 執行個體化 進行輸出值看一下
package com.example.aplicationdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("CREATE","activity created..."); <span style="color:#FF0000;"> MyApp app1 = (MyApp) this.getApplication(); app1.setName("xxx");</span> Log.i(TAG,"方式一:"+app1.getName()); // MyApp app2 = (MyApp) this.getApplicationContext();// Log.i(TAG,"方式二:"+app2.getName());// // MyApp app3 = MyApp.getApplicationInstance();//用在擷取不到context對象的類中// Log.i(TAG,"方式三:"+app3.getName()); } public void btn(View view){ Intent intent=new Intent(MainActivity.this,main2.class); startActivity(intent); finish(); }}
輸出值
11-10 15:38:55.099: I/MainActivity(2475): 方式一:xxx
LOG 列印 說明我們成功了。
然後我們通過 button 點擊 進入下一個activity 實驗能否成功 修改值
package com.example.aplicationdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;public class main2 extends Activity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); MyApp app1 = (MyApp) this.getApplication(); app1.setName("張泰"); Log.i(TAG,"方式一:"+app1.getName());} public void btn(View view){ Intent intent=new Intent(main2.this,main3.class); startActivity(intent); finish(); }}
11-10 15:40:38.447: I/MainActivity(2475): 方式一:張泰
可以看到成功了
我們再點擊下一個頁面試試
11-10 15:41:05.307: I/MainActivity(2475): 方式一:清哥
有成功了
這說明 aplication 設定的值 是可以全域 可用的 而且也可以被修改,思維發散下 aplication通常可以放入 一個entry類 或者 地圖的location
教你怎麼使用apilication—紀念火影-->影子模仿術