问题:
- 平时会遇到关闭所有Activity退出应用。
- 或者关闭其中指定的某些activity。这样Activity管理工具类就可以用上。
…
一.工具类代码:
package com.cgw.avoidtumble.utils;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.text.TextUtils;
import java.util.List;
import java.util.Stack;
/**
* activity管理工具类
* Created by dongtengfei on 2019/8/12 16:41.
*/
public class ActivityUtil {
private static final String TAG = "ActivityUtil";
/**
* 单一实例
*/
private static ActivityUtil sActivityUtil;
/**
* Activity堆栈 Stack:线程安全
*/
public Stack<Activity> mActivityStack = new Stack<>();
/**
* 私有构造器 无法外部创建
*/
private ActivityUtil() {
}
/**
* 获取单一实例 双重锁定
*
* @return this
*/
public static ActivityUtil getInstance() {
if (sActivityUtil == null) {
synchronized (ActivityUtil.class) {
if (sActivityUtil == null) {
sActivityUtil = new ActivityUtil();
}
}
}
return sActivityUtil;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
mActivityStack.add(activity);
}
/**
* 移除堆栈中的Activity
*
* @param activity Activity
*/
public void removeActivity(Activity activity) {
if (activity != null && mActivityStack.contains(activity)) {
mActivityStack.remove(activity);
}
}
/**
* 获取当前Activity (堆栈中最后一个添加的)
*
* @return Activity
*/
public Activity getCurrentActivity() {
return mActivityStack.lastElement();
}
/**
* 获取指定类名的Activity
*/
public Activity getActivity(Class<?> cls) {
if (mActivityStack != null) {
for (Activity activity : mActivityStack) {
if (activity.getClass().equals(cls)) {
return activity;
}
}
}
return null;
}
/**
* 结束当前Activity (堆栈中最后一个添加的)
*/
public void finishCurrentActivity() {
Activity activity = mActivityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*
* @param activity Activity
*/
public void finishActivity(Activity activity) {
if (activity != null && mActivityStack.contains(activity)) {
mActivityStack.remove(activity);
activity.finish();
}
}
/**
* 结束指定类名的Activity
*
* @param clazz Activity.class
*/
public void finishActivity(Class<?> clazz) {
for (Activity activity : mActivityStack) {
if (activity.getClass().equals(clazz)) {
finishActivity(activity);
break;
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = mActivityStack.size() - 1; i >= 0; i--) {
if (mActivityStack.get(i) != null) {
finishActivity(mActivityStack.get(i));
}
}
mActivityStack.clear();
}
/**
* 结束某个Activity之外的所有Activity
*/
public void finishAllActivityExcept(Class<?> clazz) {
for (int i = mActivityStack.size() - 1; i >= 0; i--) {
if (mActivityStack.get(i) != null && !mActivityStack.get(i).getClass().equals(clazz)) {
finishActivity(mActivityStack.get(i));
}
}
}
/**
* 退出应用程序
*/
public void exitApp() {
try {
finishAllActivity();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
/**
* 判断某个Activity 界面是否在前台
*
* @param context
* @param className 某个界面名称
* @return
*/
public static boolean isForeground(Context context, String className) {
if (context == null || TextUtils.isEmpty(className)) {
return false;
}
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(1);
if (list != null && list.size() > 0) {
ComponentName cpn = list.get(0).topActivity;
if (className.equals(cpn.getClassName())) {
return true;
}
}
return false;
}
}
二.使用:
- 在BaseActivity中加入管理栈中:
ActivityUtil.getInstance().addActivity(this);
- 调用方法(罗列几个使用):
关闭全部Activity:
ActivityUtil.getInstance().finishAllActivity();
通过class找到对应的Activity:
ActivityUtil.getInstance().getActivity(MainActivity.class);
关闭指定的Activity:
ActivityUtil.getInstance().finishActivity(MainActivity.class);
三.顺便罗列出基础的BaseActivity和BaseFragment
可以在上面增加和减少内容:
BaseActivity
package com.cgw.avoidtumble.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.cgw.avoidtumble.utils.ActivityUtil;
import butterknife.ButterKnife;
/**
* Created by dongtengfei on 2019/8/12 0005 10:28.
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayoutId());
ButterKnife.bind(this);
initView();
initData();
ActivityUtil.getInstance().addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.bind(this).unbind();
}
/**
* 初始化视图文件
*
* @return
*/
public abstract int initLayoutId();
/**
* 初始化视图布局效果
*/
public abstract void initView();
/**
* 初始化视图数据
*/
public abstract void initData();
}
**
BaseFragment
**
package com.cgw.avoidtumble.base;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.socks.library.KLog;
import butterknife.ButterKnife;
import butterknife.Unbinder;
/**
* Created by dongtengfei on 2019/8/12 16:18.
*/
public abstract class BaseFragment extends Fragment {
protected Context context;
protected View rootView;
private Unbinder unbinder;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(initLayoutId(), container, false);
unbinder = ButterKnife.bind(this, rootView);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
context = getActivity();
initView();
initData();
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (unbinder != null) {
unbinder.unbind();
}
KLog.d(BaseConfig.LOG, "销毁Fragment");
}
/**
* 初始化视图文件
*
* @return
*/
public abstract int initLayoutId();
/**
* 初始化视图布局效果
*/
public abstract void initView();
/**
* 初始化视图数据
*/
public abstract void initData();
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
//此碎片可见时,去验证此账号是否在别的设备登录。
}
}
}