抽象类BaseActivity的封装
2017-05-10 11:40
183 查看
将BaseActivity设置为抽象类,其他子Activity继承BaseActivity,优点:
1)简化子类代码复杂度(共性方法)
通过继承机制,在基类中封装好默认需实现的共性方法,可以减少子类编写重复代码的工作量,使子类专注于自己的特有功能,也提高了代码可读性、可维护性。
2) 强制规范子类行为
通过将BaseActivity设置为抽象类,预先定义好需要实现的方法,强制子类实现相关方法,提高代码规范性(继承机制)。
3)作为UI框架实现页面嵌套
通过在BaseActivity中定义外层界面,子类Activity继承后,可以直接调用父类的方法实现页面嵌套。
4) 常见用法
利用Inflater机制实现页面嵌套.得益于Android的Inflater机制,子类中通过Inflater实现对父类中的View的填充,类似于页面嵌套,或者是向UI框架填充相应的内容。
在BaseActivity的onCreate()中调用抽象方法
抽象类BaseActivity不需要在AndroidManifest.xml配置,它不是具体的类。
继承于一个类,让它成为抽象类,加上一些初始化的抽象方法,这样子类在继承这个类的时候就必须去实现这些抽象方法,就不用我们去手动添加,这样也不会让我们丢失了一些操作,如初始化等,而且在抽象类中把这些初始化的方法添加到了onCreate()方法中,这样我们的子类只要继承于BaseActivity,有以下两点好处:
1)肯定我们不用再去手动添加实现findViews() init() setLinsteners()这些初始化方法了
2)我们不用再在每个Activity中手动调用这三个方法,因为我们的BaseActivity已经为我们做好了封装,只要重写这三个抽象方法就好了就好了
代码如下:Dagger2+BufferKnife
ActivityComponent中的代码:
//添加日志拦截器:看看效果
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClientBuilder.addInterceptor(interceptor);
添加依赖的方式,而非导入jar包,否则可能导致方法数超过65535,导致apk过大。
对项目依赖的管理:
compile 'com.alibaba:fastjson:1.2.37'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
类头注释:
/**
* Created on ${DATE}.
* Author:crs
* Description:
*/
项目里面已经使用了Bufferknife所以就不需要在使用
setOnClistenerListener(this)
LoginAct里面有很多冗余的代码(版本维护的时候进行删除)
在父类里面封装了加载对话框以及隐藏对话框的操作。
项目里的初始化方法:父类BaseActivity里面的抽象方法
getLayoutId()
initParams()
1)简化子类代码复杂度(共性方法)
通过继承机制,在基类中封装好默认需实现的共性方法,可以减少子类编写重复代码的工作量,使子类专注于自己的特有功能,也提高了代码可读性、可维护性。
2) 强制规范子类行为
通过将BaseActivity设置为抽象类,预先定义好需要实现的方法,强制子类实现相关方法,提高代码规范性(继承机制)。
3)作为UI框架实现页面嵌套
通过在BaseActivity中定义外层界面,子类Activity继承后,可以直接调用父类的方法实现页面嵌套。
4) 常见用法
利用Inflater机制实现页面嵌套.得益于Android的Inflater机制,子类中通过Inflater实现对父类中的View的填充,类似于页面嵌套,或者是向UI框架填充相应的内容。
在BaseActivity的onCreate()中调用抽象方法
抽象类BaseActivity不需要在AndroidManifest.xml配置,它不是具体的类。
继承于一个类,让它成为抽象类,加上一些初始化的抽象方法,这样子类在继承这个类的时候就必须去实现这些抽象方法,就不用我们去手动添加,这样也不会让我们丢失了一些操作,如初始化等,而且在抽象类中把这些初始化的方法添加到了onCreate()方法中,这样我们的子类只要继承于BaseActivity,有以下两点好处:
1)肯定我们不用再去手动添加实现findViews() init() setLinsteners()这些初始化方法了
2)我们不用再在每个Activity中手动调用这三个方法,因为我们的BaseActivity已经为我们做好了封装,只要重写这三个抽象方法就好了就好了
代码如下:Dagger2+BufferKnife
package com.example.administrator.myapplication.Base; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import com.example.administrator.myapplication.dagger.component.ActivityComponent; import com.example.administrator.myapplication.dagger.component.DaggerActivityComponent; import com.example.administrator.myapplication.dagger.module.ActivityModule; import butterknife.ButterKnife; /** * Created on 2017/5/10. * Author:crs * Description:BaseActivity抽象父类 */ public abstract class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; public Context mContext; ActivityComponent mActivityComponent; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build(); mContext = this; setContentView(); //ButterKnife,this指代子Activity ButterKnife.bind(this); //Log.i(TAG,this+""); MainActivity@53538dd8 //Dagger2 initInject(); init(); } //依赖注入 public abstract void initInject(); //设置布局 public abstract void setContentView(); //初始化控件 public abstract void init(); //通用性方法 public void showToast(String msg) { Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_SHORT).show(); } //子Activity通过此ActivityComponent进行依赖注入 public ActivityComponent getActivityComponent() { return mActivityComponent; } }MainActivity中的代码:
package com.example.administrator.myapplication; import android.widget.TextView; import com.example.administrator.myapplication.Base.BaseActivity; import butterknife.BindView; import butterknife.OnClick; public class MainActivity extends BaseActivity { //此方法已经不需要,调用默认的就可以了。 //@Override //protected void onCreate(Bundle savedInstanceState) { // super.onCreate(savedInstanceState); // ButterKnife.bind(this); //} @BindView(R.id.tv_content) TextView tv_content; @Override public void initInject() { //注入当前Activity,mActivityComponent()封装在父类中; //ActivityComponent文件中:连接器 //ActivityModule:主要用于提供presenter类的对象,方法有参数,是通过构造函数提供的对象。 getActivityComponent().inject(this); } @Override public void setContentView() { setContentView(R.layout.activity_main); } @Override public void init() { } @OnClick(R.id.btn) public void loadData(){ } }
ActivityComponent中的代码:
package com.example.administrator.myapplication.dagger.component; ; import com.example.administrator.myapplication.MainActivity; import com.example.administrator.myapplication.dagger.module.ActivityModule; import dagger.Component; /** * Created on 2017/5/10. * Author:crs * Description:ActivityComponent连接器 */ @Component(modules = {ActivityModule.class}) public interface ActivityComponent { //注入MainActivity void inject(MainActivity activity); }ActivityModule中的代码:
package com.example.administrator.myapplication.dagger.module; import android.app.Activity; import dagger.Module; import dagger.Provides; /** * Created on 2017/5/10. * Author:crs * Description:ActivityModule,自定义module类 */ @Module public class ActivityModule { private Activity mActivity; public ActivityModule(Activity activity) { this.mActivity = activity; } @Provides public Activity provideActivity() { return mActivity; } }
//添加日志拦截器:看看效果
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClientBuilder.addInterceptor(interceptor);
添加依赖的方式,而非导入jar包,否则可能导致方法数超过65535,导致apk过大。
对项目依赖的管理:
compile 'com.alibaba:fastjson:1.2.37'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
类头注释:
/**
* Created on ${DATE}.
* Author:crs
* Description:
*/
项目里面已经使用了Bufferknife所以就不需要在使用
setOnClistenerListener(this)
LoginAct里面有很多冗余的代码(版本维护的时候进行删除)
在父类里面封装了加载对话框以及隐藏对话框的操作。
项目里的初始化方法:父类BaseActivity里面的抽象方法
getLayoutId()
initParams()
相关文章推荐
- PCB MATRIX IPC软件制作封装时不显示焊盘的解决办法
- 黑马程序员------面向对象(No.2)(封装、构造函数、构造代码块、this)
- 封装按钮
- CentOS7 iso封装语句
- 项目中封装了一个弹出框但是点击上面的按钮就崩溃,尽在iOS9.0以下版本出现
- 封装的多种实现
- 2013-09-08面向对象_封装
- 作业5 四则运算 测试与封装 5.1
- 网络框架的封装(一)
- hibernate原生sql封装DTO
- 封装数据出错-->字符串-时间
- 使用Spring.Net将业务类封装成WebService
- USB 2.0 A型、B型、Mini和Micro接口定义及封装
- Practice5.1 测试与封装5.1
- 下拉菜单(二) PopupWindow 封装实现
- centos apache ab性能测试工具介绍、使用及封装供shell调用
- iOS 之AFN封装
- Java:如何封装集合
- spring集成mongodb封装的简单的CRUD