- Application是維護全局狀态的基類,Android系統會在啟動應用程序時建立一個Application對象。application裡面的對象變量是屬于整個系統的。
- 在啟動程式時會建立application對象,是以Application對象誕生于其他任何元件對象之前,并且一直存活,直到應用程序結束。
- 預設情況下系統會為每個應用配置設定一個程序,程序的名稱就是每個項目的包名,當程序啟動的時候,系統會建立application對象,并調用對象的onCreate函數。
- application在項目運作過程中不會改變,而activity在切換過程中,會有不斷的建立和銷毀,服務切換也是建立和銷毀,但是application不會改變
-
Application對象由Android系統管理,其回調函數都運作于UI線程即主線程,
回調函數有onCreate,onConfigurationChanged即系統配置變更,包括螢幕方向變化,系統語言變化等,onLowMemory釋放記憶體
- application對象全局可通路,且全程陪同應用程序,适合共享全局狀态,初始化全應用所需的服務。
- 靜态單例也可以實作全局狀态的共享
自定義application類
繼承Application類,并在AndroidManifest.xml檔案中的application下添加name屬性,加上自定義的application類。
接下來以一個執行個體來展示application類的全局應用狀态。
兩張圖檔分别對應兩個Activity,MyApplication類是Application類的子類,在MyApplication類中聲明name變量,為其設定set和get方法。在Activity1和Activity2中擷取MyApplication的變量,并在Activity1中設定name變量。
下面是MyApplication的實作:
public class MyApplication extends Application {
public static String name="ann";
public static String getName() {
return name;
}
public static void setName(String name) {
MyApplication.name = name;
}
//Application的建立,第一個建立,比Activity中的onCreate方法調用還要早
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "application_onCreate"+this, Toast.LENGTH_SHORT).show();
}
//監聽系統變化的方法,如螢幕旋轉,語言更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
//回收記憶體
@Override
public void onLowMemory() {
super.onLowMemory();
}
}
Activity1的實作:
public class Activity1 extends AppCompatActivity implements View.OnClickListener{
private Button setname,getname,startActivity;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setname=(Button)findViewById(R.id.setusername);
getname=(Button)findViewById(R.id.getusername);
startActivity=(Button)findViewById(R.id.startactivity);
setname.setOnClickListener(this);
getname.setOnClickListener(this);
startActivity.setOnClickListener(this);
}
//當從Activity2跳轉到Activity1時會調用這個方法,即Activity1恢複
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "Activity1"+getApplication(), Toast.LENGTH_SHORT).show();
}
//Activity1到activity2時,Activity1暫停狀态
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "Activity2"+getApplication(), Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.getusername:
//擷取application裡變量的用法,注意強制類型轉換,而且在AndroidManifest檔案中一定要添加name屬性,否則運作失敗
MyApplication myApplication=(MyApplication)getApplication();
//設定name之前擷取的是原來的name,設定之後則擷取之後的name
String name=myApplication.getName();
Toast.makeText(this, "getname--"+name, Toast.LENGTH_SHORT).show();
break;
case R.id.setusername:
MyApplication myApplication1=(MyApplication)getApplication();
myApplication1.setName("zhangsan");
Toast.makeText(this, "setname"+myApplication1.getName(), Toast.LENGTH_SHORT).show();
break;
case R.id.startactivity:
startActivity(new Intent(Activity1.this,Activity2.class));
break;
}
}
}
Activity2的實作:
public class Activity2 extends AppCompatActivity {
private Button getname;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
getname=(Button)findViewById(R.id.getusername2);
getname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyApplication myApplication=(MyApplication)getApplication();
String name=myApplication.getName();
//擷取的name和Activity1中擷取的name相同,說明application的對象是屬于全局的。
Toast.makeText(Activity2.this, "getname:"+name, Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, "Activity2-"+getApplication(), Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, "Activity2-"+getApplication(), Toast.LENGTH_SHORT).show();
}
}
最後附上别人的Application筆記:
https://blog.csdn.net/pi9nc/article/details/11200969