转载请标明出处:
http://blog.csdn.net/changs_roid/article/details/52848552
今天还看到有人对app退出感到苦恼,因此分享下自己的经验。我在项目中会建立一个activity的管理者ActControl,管理所有activity栈中的act。
结束时你可以遍历这个act集合。全部finish掉就行了。
用法:
在BaseActivity中
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
ActControl.onResume(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActControl.onDestroy(this);
}
//other...
}
/**
* 获取最顶层的act实例
* @return act实例
*/
public static BaseActivity getTop();
/**
* 查找某个act是否任务栈
* @param cls 要查找的act的class
* @return 满足的act实例
*/
public BaseActivity findExistInner(Class> cls);
public class ActControl {
private static final String TAG = "ActControl";
private List> list;
private ActControl() {
this.list = new ArrayList<>();
}
private void resume(BaseActivity activity) {
int size = list.size();
for (int i = 0; i < size; i++) {
SoftReference softReference = list.get(i);
BaseActivity act = softReference.get();
if (act == null) {
list.remove(softReference);
i--;
size--;
} else if (act == activity) {
if (i != size - 1) {
Collections.swap(list, i, size - 1);
}
return;
}
}
list.add(new SoftReference<>(activity));
}
private void destroy(BaseActivity activity) {
int size = list.size();
for (int i = 0; i < size; i++) {
SoftReference softReference = list.get(i);
BaseActivity act = softReference.get();
if (act != null && act == activity) {
list.remove(softReference);
return;
}
}
}
private BaseActivity top() {
int index = list.size() - 1;
while (index >= 0) {
SoftReference softReference = list.get(index);
if (softReference.get() != null) {
return softReference.get();
} else {
index--;
}
}
MyLog.e(TAG, "error,top is null");
return null;
}
private List> getList() {
return list;
}
private static ActControl CONTROL = new ActControl();
public static void onResume(BaseActivity activity) {
CONTROL.resume(activity);
MyLog.d(TAG, "onResume size = " + CONTROL.getList().size());
}
public static void onDestroy(BaseActivity activity) {
CONTROL.destroy(activity);
MyLog.d(TAG, "onDestroy size = " + CONTROL.getList().size());
}
public static BaseActivity findExist(Class> cls) {
return CONTROL.findExistInner(cls);
}
public static BaseActivity getTop() {
return CONTROL.top();
}
public BaseActivity findExistInner(Class> cls) {
for (SoftReference ref : list) {
final BaseActivity activity = ref.get();
if (activity != null && activity.getClass() == cls)
return activity;
}
return null;
}
}