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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值