BaseActivity并不是个陌生的事物,如同一个老大哥般指引着项目的第一步,是个相当亲切的事物。每个项目由于其需求不同BaseActivity也不尽相同,但大方向来说随着经验的丰富会有更多的通用的功能会被封装进来,但也要根据所需进行适度的筛选,尽量使它强大而不臃肿。这里记录一些四处搜刮来的和自己项目中用到的一些可以封装的功能以及其简略代码,以备健忘症发作的时候作为参考。
(1)对弹出简单dialog的封装
/**
* 对showDialog的简易封装。线程安全,可以在非UI线程调用。
*
* @param Dialog实例
*
*/
public void showDialogSafe(final Dialog dialog) {
if (Process.myTid() == mUIThreadId) {
// 调用在UI线程
showDialog(dialog);
} else {
// 调用在非UI线程
new Handler().post(new Runnable() {
@Override
public void run() {
showDialog(dialog);
}
});
}
}
private void showDialog(Dialog dialog) {
if (!mDialogs.contains(dialog)) {
dialog.show();
mDialogs.add(dialog);
} else {
}
}
/**
* 对dismissDialog的简易封装。线程安全,可以在非UI线程调用。
*
* @param Dialog实例
*
*/
public void dismissDialogSafe(final Dialog dialog) {
if (Process.myTid() == mUIThreadId) {
// 调用在UI线程
dismissDialog(dialog);
} else {
// 调用在非UI线程
new Handler().post(new Runnable() {
@Override
public void run() {
dismissDialog(dialog);
}
});
}
}
private void dismissDialog(Dialog dialog) {
try {
dialog.dismiss();
mDialogs.remove(dialog);
dialog = null;
} catch (Exception e) {
e.printStackTrace();
}
}
(2)Toast
有些时候会发生反复弹出吐司的情况,内容相同的不同的,总之会一个接着一个按序显示在屏幕上,又臭又长,烦得很。可以做个封装,判断当前吐司是否存在决定吐司的显示方式。
void showToastShort(String s) {
if (mToast == null) {
mToast = Toast.makeText(this, s, Toast.LENGTH_SHORT);
}else{
mToast.cancel();
mToast = Toast.makeText(this, s, Toast.LENGTH_SHORT);
}
mToast.show();
}
那么能否判断显示内容是否一致从而干掉后来的吐司呢?可以尝试一下,不过这样做有利有弊,得看具体需求了。也可以在application中进行统一管理,至于为什么用线程,这个我再考虑一下。。。
public void showToast(final String msg) {
mHandler.post(new Runnable() {
@Override
public void run() {
if (mToast == null) {
mToast = Toast.makeText(MyApplication.this, msg, Toast.LENGTH_SHORT);
} else {
mToast.cancel();
mToast = Toast.makeText(MyApplication.this.this, msg, Toast.LENGTH_SHORT);
}
mToast.show();
}
});
}
(3)对Context的管理
这个可以配合application来做,在application中建立一个HashMap来保存Activity的类名以及对应context的软引用,当需要使用context是可以通过该Map来查找对应活动activity的context。
//在application中定义设置以及get方法,应用同步关键字为方法上锁,因为hashMap并不是线程安全的
public static synchronized void setActiveContext(Activity context) {
WeakReference<Activity> reference = new WeakReference<Activity>(context);
mContexts.put(context.getClass().getSimpleName(), reference);
}
public static synchronized Activity getActiveContext(String className) {
WeakReference<Activity> reference = mContexts.get(className);
if (reference == null) {
return null;
}
final Activity context = reference.get();
if (context == null) {
mContexts.remove(className);
}
return context;
}
然后在baseActivity的onCreate()中调用set方法
MyApplication.setActiveContext(this);
(4)fragment
现在一般都会配合fragment进行开发,可以封装一些对fragment的操作。从BaseActivity与BaseFragment的封装谈起
//添加fragment
protected void addFragment(BaseFragment fragment) {
if (fragment != null) {
getSupportFragmentManager().beginTransaction()
.replace(getFragmentContentId(), fragment, fragment.getClass().getSimpleName())
.addToBackStack(fragment.getClass().getSimpleName())
.commitAllowingStateLoss();
}
}
//移除fragment
protected void removeFragment() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
getSupportFragmentManager().popBackStack();
} else {
finish();
}
}
(5)handler
每次new新的handler会感觉很麻烦,可以封装一下减少几行代码量。这篇博客会介绍的很全面Android App框架设计之编写基类BaseActivity
还会介绍一些其他的一些常见的封装,如控制软键盘弹出,横竖屏切换等