`
ZixinA
  • 浏览: 696 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计一个通用的BaseActivity

 
阅读更多

如果是只有一个Activity的App就没有必要写BaseActivity,但一旦大于一个我还是建议写一个BaseActivity,准没错。

每个Activity通常都是绑定视图,绑定控件,监听控件,获取Bundle,跳转Activity还有一些很有些烦人的小功能如:Toast,findViewById,我们都可以封装一层简化他们的使用

BaseActivity的代码如下:

public abstract class BaseActivity extends Activity implements View.OnClickListener {
    /** 是否沉浸状态栏 **/
    private boolean isSetStatusBar = true;
    /** 是否允许全屏 **/
    private boolean mAllowFullScreen = true;
    /** 是否禁止旋转屏幕 **/
    private boolean isAllowScreenRoate = false;
    /** 当前Activity渲染的视图View **/
    private View mContextView = null;
    /** 日志输出标志 **/
    protected final String TAG = this.getClass().getSimpleName();

    /** View点击 **/
    public abstract void widgetClick(View v);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "BaseActivity-->onCreate()");
        Bundle bundle = getIntent().getExtras();
        initParms(bundle);
        View mView = bindView();
        if (null == mView) {
            mContextView = LayoutInflater.from(this)
                    .inflate(bindLayout(), null);
        } else
            mContextView = mView;
        if (mAllowFullScreen) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }
        if (isSetStatusBar) {
            steepStatusBar();
        }
        setContentView(mContextView);
        if (!isAllowScreenRoate) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        initView(mContextView);
        setListener();
        doBusiness(this);
    }

    /**
     * [沉浸状态栏]
     */
    private void steepStatusBar() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // 透明状态栏
            getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 透明导航栏
            getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }

    /**
     * [初始化参数]
     *
     * @param parms
     */
    public abstract void initParms(Bundle parms);

    /**
     * [绑定视图]
     *
     * @return
     */
    public abstract View bindView();

    /**
     * [绑定布局]
     *
     * @return
     */
    public abstract int bindLayout();

    /**
     * [初始化控件]
     *
     * @param view
     */
    public abstract void initView(final View view);

    /**
     * [绑定控件]
     *
     * @param resId
     *
     * @return
     */
    protected    <T extends View> T $(int resId) {
        return (T) super.findViewById(resId);
    }

    /**
     * [设置监听]
     */
    public abstract void setListener();

    @Override
    public void onClick(View v) {
        widgetClick(v);
    }

    /**
     * [业务操作]
     *
     * @param mContext
     */
    public abstract void doBusiness(Context mContext);



    /**
     * [页面跳转]
     *
     * @param clz
     */
    public void startActivity(Class<?> clz) {
        startActivity(new Intent(BaseActivity.this,clz));
    }

    /**
     * [携带数据的页面跳转]
     *
     * @param clz
     * @param bundle
     */
    public void startActivity(Class<?> clz, Bundle bundle) {
        Intent intent = new Intent();
        intent.setClass(this, clz);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }

    /**
     * [含有Bundle通过Class打开编辑界面]
     *
     * @param cls
     * @param bundle
     * @param requestCode
     */
    public void startActivityForResult(Class<?> cls, Bundle bundle,
                                       int requestCode) {
        Intent intent = new Intent();
        intent.setClass(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy()");
    }

    /**
     * [简化Toast]
     * @param msg
     */
    protected void showToast(String msg){
        Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
    }

    /**
     * [是否允许全屏]
     *
     * @param allowFullScreen
     */
    public void setAllowFullScreen(boolean allowFullScreen) {
        this.mAllowFullScreen = allowFullScreen;
    }

    /**
     * [是否设置沉浸状态栏]
     *
     * @param isSetStatusBar
     */
    public void setSteepStatusBar(boolean isSetStatusBar) {
        this.isSetStatusBar = isSetStatusBar;
    }

    /**
     * [是否允许屏幕旋转]
     *
     * @param isAllowScreenRoate
     */
    public void setScreenRoate(boolean isAllowScreenRoate) {
        this.isAllowScreenRoate = isAllowScreenRoate;
    }

}

可以看到还是很多重复代码的,所以说搞一个BaseActivity是多么有必要

继承自BaseActivity的Activity使用如下:

public class MainActivity extends BaseActivity {
    private Button btn1;
    @Override
    public void widgetClick(View v) {
        switch (v.getId()){
            case R.id.button:
                //用简化了的toast和startActivity
                showToast("toast");
                startActivity(Main2Activity.class);
                break;
        }
    }

    @Override
    public void initParms(Bundle parms) {
        //解析bundle内容或者设置是否旋转,沉浸,全屏
    }

    @Override
    public View bindView() {
        return null;
    }

    @Override
    public int bindLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void initView(View view) {
        btn1=$(R.id.button);
    }

    @Override
    public void setListener() {
        btn1.setOnClickListener(this);
    }

    @Override
    public void doBusiness(Context mContext) {

    }


}

其实不仅是Activity要搞一个基类,Fragment也要搞一个基类,这样可以大大减少重复代码,而且管理起来还比较容易,保持了样式的一致,如果想个性化也预留了相应的方法。

分享到:
评论

相关推荐

    BaseActivity

    一个好的BaseActivity设计可以帮助提升开发效率,降低维护成本,同时也能确保代码的规范性和一致性。因此,理解并熟练运用BaseActivity是Android开发者必备的技能之一。在实现BaseActivity时,应遵循“高内聚,低...

    自定义BaseActivity

    1. **定义基类**: 创建一个名为`BaseActivity`的类,让它继承自Android的`AppCompatActivity`或`Activity`。`AppCompatActivity`是Google推荐的用于支持Material Design的Activity基类。 ```java public class ...

    BaseActivity的使用

    在Android开发中,`BaseActivity`是一个常见的设计模式,它被用作所有其他活动(Activity)的基类,目的是为了代码复用和模块化。通过继承`BaseActivity`,开发者可以将通用的功能集中到一个地方,减少每个具体...

    android加载BaseActivity的布局

    `BaseActivity`就是这样一个基础类,它通常包含一些通用的功能和布局,子类Activity可以继承它,从而避免代码重复。在这个场景下,我们将探讨如何自定义标题栏并在`BaseActivity`中加载布局。 首先,我们来创建`...

    mvp封装+baseactivity封装.

    4. **Activity或Fragment的封装**:创建一个BaseActivity或BaseFragment,实现View接口,并持有Presenter的实例。在这个基类中,我们可以设置Presenter的生命周期管理,如在onCreate中初始化Presenter,在onDestroy...

    Android项目基类BaseActivity

    在Android应用开发中,`BaseActivity`是一种常见的做法,它是一个基础活动类,通常用于封装共性的功能,以便在其他具体活动(子类)中复用。通过创建`BaseActivity`,开发者可以避免代码重复,提高代码的可维护性和...

    Base:一些基本代码的库,例如 BaseAdapter、BaseActivity、BaseFragement

    BaseActivity是Activity的一个抽象基类,它的主要目的是封装一些通用的逻辑,比如初始化布局、处理权限、设置全局主题等。开发者可以在这个基类中添加公共的方法,然后在具体的Activity中继承它,减少代码重复。...

    Android中BaseActivity自定义标题栏

    首先,创建一个名为BaseActivity的基类,该类继承自AppCompatActivity。AppCompatActivity是Android支持库中的一个关键组件,它提供了对Android 5.0(API级别21)及更高版本Material Design特性的兼容。在...

    Android-BaseFramework是对BaseActivity与BaseFragment的整合库

    "Android-BaseFramework"就是这样一个专门针对BaseActivity和BaseFragment进行整合的库,旨在简化开发者的工作流程,提高开发效率。这个框架允许开发者直接从jCenter进行引用,意味着它已经被广泛测试并且与Android...

    基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合ViewModel+Lifecycles+Naviga.zip

    可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,...

    Android基于retrofit封装的网络请求库以及baseActivity高度集成定制

    在Android应用中,通常会有一个基类` BaseActivity`,用于复用通用功能,如权限管理、状态栏设置等。在此项目中,可以将网络请求的调用方法集成到`BaseActivity`,如`doNetworkRequest()`,并且提供统一的回调处理...

    Android 通用标题栏 简单封装实现

    本教程将详细介绍如何通过简单的封装实现一个适用于各种场景的通用标题栏。参考链接:[Android 通用标题栏 简单封装实现](http://blog.csdn.net/RichieZhu/article/details/50935918)。 首先,我们需要了解Android...

    BaseActivity:活动的启动模式之singleInstance;技术亮点1.baseactivity的书写2.用ActivityCollector管理所有活动

    本项目主要探讨了`Activity`的启动模式之一——`singleInstance`,以及如何通过一个`BaseActivity`来规范和管理所有的`Activity`,具体的技术亮点包括`BaseActivity`的设计与实现,以及使用`ActivityCollector`进行`...

    安卓Android商品购物系统app设计源码.zip

    【标题】"安卓Android商品购物系统app设计源码"揭示了本项目的核心是关于构建一个Android平台上的在线购物应用程序。这个应用可能包含了完整的用户界面、后台数据管理、购物车功能、支付接口集成以及订单处理等一...

    MVP_Demo.zip

    为了减少重复代码,开发者通常会创建一个`BaseActivity`,将这些通用功能集中在此类中,然后让其他Activity继承自`BaseActivity`,从而实现代码复用。 3. **Retrofit**:Retrofit是一个强大的HTTP客户端库,它允许...

    Android-一个项目的基类包含BaseActivityBaseFragment等

    此外,`yangsongsong-BaseUtils-d67f094`这个文件名可能指向一个名为BaseUtils的库或模块,其中包含了各种通用的工具方法。这类工具类通常包含如字符串处理、日期时间操作、网络请求封装等功能,进一步提高了代码的...

    android 项目简单的基本配置

    综上所述,一个简单的Android项目基本配置包括对`BaseActivity`和`BaseDialog`的基类设计,全局的Activity动画设定,以及自定义`TitleBar`以提升用户体验。通过合理地使用这些技术,开发者可以构建出结构清晰、易于...

    Android Base类

    在Android应用开发中,`BaseActivity`是一种常见的设计模式,它是所有其他Activity的基类,用于实现一些通用功能,以减少代码重复并提高代码复用性。本篇将深入探讨`BaseActivity`的设计原理和常见实践,以及如何...

    BaseToolbarActivity.zip

    在Android应用开发中,`BaseToolbarActivity`是一个常见的设计模式,用于封装通用的工具栏(Toolbar)操作,以便在多个Activity之间复用。这个压缩包`BaseToolbarActivity.zip`包含了一个基本的实现,具备了Toolbar...

    安卓APP开发基本框架-页面容器跳转

    接下来是`Fragment`,它是安卓UI设计的一个重要部分。它代表屏幕上的一个可重用部分,可以在不同的`Activity`之间移动和替换,使得UI可以根据设备的屏幕大小和方向进行动态调整。在Tab切换场景下,`Fragment`特别...

Global site tag (gtag.js) - Google Analytics