天天看點

Android之Application的使用

  1. Application是維護全局狀态的基類,Android系統會在啟動應用程序時建立一個Application對象。application裡面的對象變量是屬于整個系統的。
  2. 在啟動程式時會建立application對象,是以Application對象誕生于其他任何元件對象之前,并且一直存活,直到應用程序結束。
  3. 預設情況下系統會為每個應用配置設定一個程序,程序的名稱就是每個項目的包名,當程序啟動的時候,系統會建立application對象,并調用對象的onCreate函數。
  4. application在項目運作過程中不會改變,而activity在切換過程中,會有不斷的建立和銷毀,服務切換也是建立和銷毀,但是application不會改變
  5. Application對象由Android系統管理,其回調函數都運作于UI線程即主線程,

    回調函數有onCreate,onConfigurationChanged即系統配置變更,包括螢幕方向變化,系統語言變化等,onLowMemory釋放記憶體

  6. application對象全局可通路,且全程陪同應用程序,适合共享全局狀态,初始化全應用所需的服務。
  7. 靜态單例也可以實作全局狀态的共享

自定義application類

繼承Application類,并在AndroidManifest.xml檔案中的application下添加name屬性,加上自定義的application類。

接下來以一個執行個體來展示application類的全局應用狀态。

Android之Application的使用
Android之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

繼續閱讀