Android Activity的统一管理类
2017-11-17 本文已影响254人
Sky_Blue
一、概述
Android实际开发中经常会有以下需求:
1.当你的应用打开多个页面的时候,怎么优雅的退出应用程序?
2.当你打开多个页面的时候,怎么回到应用首页?
二、实现思路
退出应用程序无非是将所有打开的页面关闭销毁,如果有必要顺便杀死自己的应用进程。
那怎么样才能一次性关闭多个打开的页面呢?无非就是将打开的页面用一个集合进行记录。
三、实现
1.全局使用统一的类进行管理,使用单例模式
2.用集合记录打开的Activity,在Activity创建的时候添加,销毁的时候移除。
四、代码实现
/**
* Activity的统一管理类
*/
public class ActivityUtils {
private static volatile ActivityUtils mInstance;
/**
* 所有打开的Activity
*/
private final CopyOnWriteArrayList<Activity> mActivities;
private ActivityUtils() {
mActivities = new CopyOnWriteArrayList<>();
}
public static ActivityUtils getDefault() {
if (mInstance == null) {
synchronized (ActivityUtils.class) {
if (mInstance == null) {
mInstance = new ActivityUtils();
}
}
}
return mInstance;
}
/**
* 添加统一管理
*/
public void attach(Activity activity) {
mActivities.add(activity);
}
/**
* 移除解绑 - 防止内存泄漏
*
* @param detachActivity
*/
public synchronized void detach(Activity detachActivity) {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
if (mActivities.get(i) == detachActivity) {
mActivities.remove(i);
size--;
i--;
}
}
}
/**
* 根据Activity的类名关闭 Activity
*/
public void finish(Class<? extends Activity> activityClass) {
for (int i = 0; i < mActivities.size(); i++) {
Activity activity = mActivities.get(i);
if (activity.getClass().getCanonicalName().equals(activityClass.getCanonicalName())) {
activity.finish();
break;
}
}
}
/**
* 退出整个应用
*/
public void exit() {
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
activity.finish();
}
}
/**
* 获取当前的Activity(最前面)
*/
public Activity getCurrentActivity() {
return mActivities.get(mActivities.size() - 1);
}
}
5.Activity使用
/**
* Activity的Base类
*/
public abstract class BaseActivity extends SwipeBackActivity {
protected HttpUtils mHttpUtils;
protected View mContentView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityUtils.getDefault().attach(this);
}
@Override
protected void onDestroy() {
ActivityUtils.getDefault().detach(this);
super.onDestroy();
}
}