說明:大部分內容都是參考別的文章,這裏做整理是爲了以後的編程有實用的模板,可以即需即用。
一、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