一般应用开发都会写一个 BaseActivity 来做一些公共内容的整理封装,一般哪些内容需要写呢,有哪些需要注意的地方?
- 修改BaseActiviy的继承为Fragment(可以实现dialogfragment)
- 增加isDebug和APP_NAME,在Application中声明,方便日志打印,区分测试版本和正式版本
- 添加快速点击导致的各种问题。
package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
public abstract class BaseActivity extends Activity implements OnClickListener {
/** 是否沉浸状态栏 **/
private boolean isSetStatusBar = true;
/** 是否允许全屏 **/
private boolean mAllowFullScreen = true;
/** 是否禁止旋转屏幕 **/
private boolean isAllowScreenRoate = false;
/** 当前Activity渲染的视图View **/
private View mContextView = null;
/** 是否输出日志信息 **/
private boolean isDebug;
private String APP_NAME;
protected final String TAG = this.getClass().getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isDebug = MApplication.isDebug;
APP_NAME = MApplication.APP_NAME;
$Log(TAG + "-->onCreate()");
try {
Bundle bundle = getIntent().getExtras();
initParms(bundle);
mContextView = LayoutInflater.from(this).inflate(bindLayout(), null);
if (mAllowFullScreen) {
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
if (isSetStatusBar) {
steepStatusBar();
}
setContentView(mContextView);
if (!isAllowScreenRoate) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
initView(mContextView);
doBusiness(this);
} catch (Exception e) {
e.printStackTrace();
}
}
/** * [沉浸状态栏] */
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);
}
}
/**
* * [初始化Bundle参数] *
* @param parms
*/
public abstract void initParms(Bundle parms);
/** * [绑定布局] * * @return */
public abstract int bindLayout();
/** * [重写: 1.是否沉浸状态栏 2.是否全屏 3.是否禁止旋转屏幕] */
// public abstract void setActivityPre();
/** * [初始化控件] * * @param view */
public abstract void initView(final View view);
/** * [业务操作] * * @param mContext */
public abstract void doBusiness(Context mContext);
/** View点击 **/
public abstract void widgetClick(View v);
@Override
public void onClick(View v) {
if (fastClick())
widgetClick(v);
}
/** * [页面跳转] * * @param clz */
public void startActivity(Class<?> clz) {
startActivity(clz, null);
}
/** * [携带数据的页面跳转] * * @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);
}
@SuppressWarnings("unchecked")
public <T extends View> T $(int resId) {
return (T) super.findViewById(resId);
}
/**
* * [含有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 onResume() {
super.onResume();
$Log(TAG + "--->onResume()");
}
@Override
protected void onDestroy() {
super.onDestroy();
$Log(TAG + "--->onDestroy()");
}
/** * [是否允许全屏] * * @param allowFullScreen */
public void setAllowFullScreen(boolean allowFullScreen) {
this.mAllowFullScreen = allowFullScreen;
}
/** * [是否设置沉浸状态栏] * * @param allowFullScreen */
public void setSteepStatusBar(boolean isSetStatusBar) {
this.isSetStatusBar = isSetStatusBar;
}
/** * [是否允许屏幕旋转] * * @param isAllowScreenRoate */
public void setScreenRoate(boolean isAllowScreenRoate) {
this.isAllowScreenRoate = isAllowScreenRoate;
}
/** * [日志输出] * * @param msg */
protected void $Log(String msg) {
if (isDebug) {
Log.d(APP_NAME, msg);
}
}
/** * [防止快速点击] * * @return */
private boolean fastClick() {
long lastClick = 0;
if (System.currentTimeMillis() - lastClick <= 1000) {
return false;
}
lastClick = System.currentTimeMillis();
return true;
}
}
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
public abstract class BaseFragment extends Fragment implements OnClickListener {
private boolean isDebug;
private String APP_NAME;
protected final String TAG = this.getClass().getSimpleName();
private View mContextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isDebug = MApplication.isDebug;
APP_NAME = MApplication.APP_NAME;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContextView = inflater.inflate(bindLayout(), container, false);
initView(mContextView);
doBusiness(getActivity());
return mContextView;
}
/** * [绑定布局] * * @return */
public abstract int bindLayout();
/** * [初始化控件] * * @param view */
public abstract void initView(final View view);
/** * [业务操作] * * @param mContext */
public abstract void doBusiness(Context mContext);
/** View点击 **/
public abstract void widgetClick(View v);
@Override
public void onClick(View v) {
if (fastClick())
widgetClick(v);
}
@SuppressWarnings("unchecked")
public <T extends View> T $(View view, int resId) {
return (T) view.findViewById(resId);
}
/** * [日志输出] * * @param msg */
protected void $Log(String msg) {
if (isDebug) {
Log.d(APP_NAME, msg);
}
}
/** * [防止快速点击] * * @return */
private boolean fastClick() {
long lastClick = 0;
if (System.currentTimeMillis() - lastClick <= 1000) {
return false;
}
lastClick = System.currentTimeMillis();
return true;
}
}
其实我都会不管写什么,先抽出一个基类来,无论activity也好,fragment也好。然后再去考虑有哪些通用方法可以抽到基类里。
一开始的时候比较少,像友盟这种需要在每个activity里做的提出来,其实渐渐写得多了,需要提出来的东西会越来越多。面相对象六大原则里有一条叫dry don't repeat yourself,简单来说就是不写重复代码,怎么实现这个原则呢,基类,抽象类,就是几个比较重要的实现方法。建议题主重点看一下设计模式,渐渐的你就会发现基类越来越大,甚至到了需要再分层的时候,你就懂了。反正记住一个点,先提个基类出来肯定没错的
一开始的时候比较少,像友盟这种需要在每个activity里做的提出来,其实渐渐写得多了,需要提出来的东西会越来越多。面相对象六大原则里有一条叫dry don't repeat yourself,简单来说就是不写重复代码,怎么实现这个原则呢,基类,抽象类,就是几个比较重要的实现方法。建议题主重点看一下设计模式,渐渐的你就会发现基类越来越大,甚至到了需要再分层的时候,你就懂了。反正记住一个点,先提个基类出来肯定没错的
我自己的项目是这样的,第一层base放网络框架,第二层把页面头布局抽出来放在里面,以后调用只需要showTitle ,showBackButton等都是一行代码的事。现在在尝试MVVP,在第三层把所有布局剥离出来,形成activity只有逻辑代码。如有说得不对的地方希望被指正(•‿•)