在Android开发过程中,我们经常常用BaseActivity,常在BaseActivity中定义全局的方法,执行适用于所有Activity的操作(统计信息,释放内存等)以及一些其他功能。
在码一个Activity的onCreate过程中,我们要init一些view,设置事件、内容、执行线程等,我们可以选择创建若干个方法,然后在onCreate方法中按照顺序调用那些方法,分别执行init,config等操作。
后来我在tataufo工作过程中学到一种方式,很简单,很实用:
1.定义public abstract class BaseAcitivity extends Activity
2.定义若干abstract方法,例如:
protected abstract void initContentView();
protected abstract void initView();
protected abstract void initData();
protected abstract void configView();
3.重写onCreate方法,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.initContentView();
this.initView();
this.initData();
if ( !configViewLater) {
this.configView();
}
}
另外,因为有些activity中可能会大量使用Bitmap,为避免Bitmap未回收,造成内存泄漏,我定义个一个addBitmapToRecycle方法,该方法把需要回收的bitmap添加到一个列表中,在avtivity的onDestroy方法里进行回收。
具体实现。
public abstract class BaseAppCompatActivity extends AppCompatActivity {
/**
* !!! 如果在 configview之前 设置该字段为true,则不会自动执行configView !!!
*/
protected boolean configViewLater = false;
protected int colorId = R.color.main_color;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.initContentView();
this.initView();
this.initData();
if ( !configViewLater) {
this.configView();
}
try {
Window window = this.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup mContentView = (ViewGroup) this.findViewById(Window.ID_ANDROID_CONTENT);
int statusBarHeight = getStatusBarHeight(this);
int statusColor = getResources().getColor(colorId);
View mTopView = mContentView.getChildAt(0);
if (mTopView != null && mTopView.getLayoutParams() != null && mTopView.getLayoutParams().height == statusBarHeight) {
//避免重复添加 View
mTopView.setBackgroundColor(statusColor);
return;
}
//使 ChildView 预留空间
if (mTopView != null) {
ViewCompat.setFitsSystemWindows(mTopView, true);
}
//添加假 View
mTopView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
mTopView.setBackgroundColor(statusColor);
mContentView.addView(mTopView, 0, lp);
} catch (Exception e){
logD("StatusBar","set color error : " + e.toString());
}
}
private List<Bitmap> bitmaps = new ArrayList<>();
/**
* 在这里 setContentView
*/
protected abstract void initContentView();
/**
* 在这里初始化需要的view
*/
protected abstract void initView();
/**
* 在这里接收上页面的data或者从本地读取需要的data
*/
protected abstract void initData();
/**
* 在这里设置监听器或者适配器等
*/
protected abstract void configView();
/**
* Constant.DEBUG 时才会输出log
* @param key
* @param content
*/
public void logD(String key, String content){
if (Constant.DEBUG){
Log.d(key, content);
}
}
/**
* 获取状态栏高度
* @param context
* @return
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
"android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
// public void sendToast(String content){
// Toast.makeText(getBaseContext(), content, Toast.LENGTH_SHORT).show();
// Snackbar.make(getWindow().getDecorView().findViewById(android.R.id.content), content, Snackbar.LENGTH_SHORT).show();
// }
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
public void addBitmapToRecycle(Bitmap bitmap){
bitmaps.add(bitmap);
}
@Override
protected void onDestroy() {
super.onDestroy();
for(int i = 0; i < bitmaps.size(); i ++){
Bitmap bitmap = bitmaps.get(i);
if (bitmap != null && !bitmap.isRecycled()){
bitmap.recycle();
}
}
}
}