Android 常用代碼整理:Application 基類、Activity 基類

說明:大部分內容都是參考別的文章,這裏做整理是爲了以後的編程有實用的模板,可以即需即用。

一、MyApplication

import android.app.Application;

public class MyApplication extends Application {

    private static MyApplication mMyApplication;

    public static MyApplication getInstance() {
        return mMyApplication;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mMyApplication = this;
    }
}
1、不可以用 new 出來的 Application 代替系統生成的 Application:

程序啓動時,系統會自動創建 Application 對象,然後運行 onCreate() 方法,其中 android.app.Application.onCreate() 方法體爲空,可以在 onCreate() 中做一些初始化工作。Application 不能自己創建,就如同不能自己創建 Activity 一樣,如果我們通過 new 創建一個 Application,會得到一個普通的類的實例,如果需要應用 Application 的地方用的是我們 new 出來的實例,則會出現空指針異常。綜上所述,使用 Application 一定要使用程序自己創建的 Application,在 onCreate() 中將對象賦值給一個變量(mMyApplication = this),後面開發中使用這個變量即可。

2、不要在 Android 的 Application 對象中緩存數據,基礎組件之間的數據共享請使用 Intent 等機制,也可使用 SharedPreferences 等數據持久化機制:

在 Android 應用中,Application 的生命週期是和整個應用一致的,只要應用沒有被系統回收,這個 Application 對象就會一直存在。但是這個 Application 對象並不是始終在內存中的,它有可能會由於系統內存不足而被回收。但系統在你重新打開這個應用時並不是重新啓動這個 Application 對象,它會創建一個新的 Application 對象並且啓動上次用戶離開時的 Activity,造成這個 app 從來沒有被 kill 掉的假象。這樣,之前在 Application 中緩存的數據都會重新初始化。不僅 Application 對象是這樣,其它的單例或者公有靜態類也有可能會由於系統內存而被殺掉。

二、BaseActivity

public class BaseActivity extends AppCompatActivity {

    protected Context mContext;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setSystemBarStyle();
        mContext = this;
    }
    
    /**
     * 用於設置狀態欄、導航欄、ActionBar樣式
     * 如果某一頁面有特殊樣式,可覆蓋重寫此方法
     */
    protected void setSystemBarStyle() {
        // 全屏,但不隱藏狀態欄,SDK21以上才支持 setStatusBarColor
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            // 預留狀態欄
            /// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            // 全屏,且隱藏狀態欄
            /// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
            // 全屏,且隱藏上方狀態欄和下方導航欄
            /// getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
            // 將導航欄設置成透明色
            /// getWindow().setNavigationBarColor(Color.TRANSPARENT);
            // 將狀態欄設置成透明色
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        // 隱藏 ActionBar,如果在 AndroidManifest.xml 設置去掉 ActionBar,則這裏可以去掉,不然會報 NullPointerException
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.hide();
        }
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    protected void showToast(String text) {
        if (!TextUtils.isEmpty(text)) {
            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
        }
    }
}

這裏有個設置全屏顯示的有趣問題:

        super.onCreate(savedInstanceState);
        // 全屏,且隱藏狀態欄
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
        setContentView(R.layout.activity_welcome);


如採用以上代碼,則經常會出現啓動頁剛啓動的一小段時間內,還能看到 titleBar,過後才全屏顯示,而我們要達到的是一啓動就是全屏顯示(上面所截啓動頁部分截圖與下面要達到的效果截圖對比):

既然代碼不行,就試着在 AndroidManifest.xml 中進行配置:

        <activity
            android:name=".WelcomeActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

採用上面配置方式會報錯,因爲啓動頁繼承自 AppCompatActivity,要用 Theme.AppCompat 的 Theme:

Caused by: java.lang.IllegalStateException: 
You need to use a Theme.AppCompat theme (or descendant) with this activity.

但是 Theme.AppCompat 中又沒有我們要的全屏顯示的 Theme,所以採用曲線救國方式,正確的配置方式如下:

        <activity
            android:name=".WelcomeActivity"
            android:screenOrientation="portrait"
            android:theme="@style/FullscreenStyle">
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/transparent</item><!-- app啓動時會白屏,所以修改狀態欄爲透明色 -->
        <item name="colorAccent">@color/app_color</item>
    </style>

    <style name="FullscreenStyle" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

參考文章:
1、https://blog.csdn.net/asdssaaaa/article/details/52189616
2、不要在Android的Application對象中緩存數據
3、https://blog.csdn.net/guolin_blog/article/details/51763825

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章