Commit 29c28144 by app_dev@sobot.com

sobot utils 1.0.4

parent f9f25485
package com.sobot.common.utils;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import com.sobot.utils.SobotLogUtils;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.Stack;
/**
* @Description: 全局上下文
* @Author: znw
* @Date: 2021/7/19 下午2:17
* @Version: 1.0
*/
public class SobotGlobalContext {
private Context mApplicationContext;
// 使用弱引用是因为存在未使用AppManager的finish方法来释放的activity,但mActivityStack并未断开对其应用导致内存泄露的问题
private Stack<WeakReference<Activity>> mActivityStack;
private SobotGlobalContext() {
}
public static void init(Application context) {
if (SobotGlobalContext.GlobalContext.globalContext.mApplicationContext == null && context != null) {
SobotGlobalContext.GlobalContext.globalContext.mApplicationContext = context;
}
}
public static SobotGlobalContext getInstance() {
return SobotGlobalContext.GlobalContext.globalContext;
}
public static SobotGlobalContext getInstance(Context context) {
if (SobotGlobalContext.GlobalContext.globalContext.mApplicationContext == null && context != null) {
SobotGlobalContext.GlobalContext.globalContext.mApplicationContext = context;
}
return SobotGlobalContext.GlobalContext.globalContext;
}
public static Context getAppContext(Context context) {
if (SobotGlobalContext.GlobalContext.globalContext.mApplicationContext == null && context != null) {
SobotGlobalContext.GlobalContext.globalContext.mApplicationContext = context.getApplicationContext();
}
return SobotGlobalContext.GlobalContext.globalContext.mApplicationContext;
}
public static Context getAppContext() {
return SobotGlobalContext.GlobalContext.globalContext.mApplicationContext;
}
private static class GlobalContext {
private static final SobotGlobalContext globalContext = new SobotGlobalContext();
private GlobalContext() {
}
}
/**
* 添加Activity到堆栈
*
* @param activity activity实例
*/
public void addActivity(Activity activity) {
if (mActivityStack == null) {
mActivityStack = new Stack<>();
}
mActivityStack.add(new WeakReference<>(activity));
}
/**
* 检查弱引用是否释放,若释放,则从栈中清理掉该元素
*/
public void checkWeakReference() {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {
it.remove();// 使用迭代器来进行安全的加锁操作
}
}
}
}
/**
* 获取当前Activity(栈中最后一个压入的)
*
* @return 当前(栈顶)activity
*/
public Activity currentActivity() {
checkWeakReference();
if (mActivityStack != null && !mActivityStack.isEmpty()) {
return mActivityStack.lastElement().get();
}
return null;
}
/**
* 结束除当前activtiy以外的所有activity
* 注意:不能使用foreach遍历并发删除,会抛出java.util.ConcurrentModificationException的异常
*
* @param activtiy 不需要结束的activity
*/
public void finishOtherActivity(Activity activtiy) {
if (mActivityStack != null && activtiy != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (temp != activtiy) {
it.remove();// 使用迭代器来进行安全的加锁操作
temp.finish();
}
}
}
}
/**
* 结束除这一类activtiy以外的所有activity
*
* @param cls 指定的某类activity
*/
public void finishOtherActivity(Class<?> cls) {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (!activity.getClass().equals(cls)) {
it.remove();// 使用迭代器来进行安全的加锁操作
activity.finish();
}
}
}
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = currentActivity();
if (activity != null) {
finishActivity(activity);
}
}
/**
* 结束指定的Activity
*
* @param activity 指定的activity实例
*/
public void finishActivity(Activity activity) {
if (activity != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity temp = activityReference.get();
if (temp == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (temp == activity) {
it.remove();
}
}
activity.finish();
}
}
/**
* 结束指定类名的所有Activity
*
* @param cls 指定的类的class
*/
public void finishActivity(Class<?> cls) {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity == null) {// 清理掉已经释放的activity
it.remove();
continue;
}
if (activity.getClass().equals(cls)) {
it.remove();
activity.finish();
}
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
if (mActivityStack != null) {
for (Iterator<WeakReference<Activity>> it = mActivityStack.iterator(); it.hasNext(); ) {
WeakReference<Activity> activityReference = it.next();
Activity activity = activityReference.get();
if (activity != null) {
activity.finish();
}
}
mActivityStack.clear();
}
}
/**
* 退出应用程序
*/
public void exitApp() {
try {
finishAllActivity();
// 退出JVM(java虚拟机),释放所占内存资源,0表示正常退出(非0的都为异常退出)
System.exit(0);
// 从操作系统中结束掉当前程序的进程
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
SobotLogUtils.e("Exit exception", e);
}
}
}
\ No newline at end of file
package com.sobot.utils;
package com.sobot.common.utils;
import android.annotation.TargetApi;
import android.content.ContentResolver;
......@@ -20,6 +20,9 @@ import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.text.TextUtils;
import com.sobot.utils.SobotIOUtils;
import com.sobot.utils.SobotLogUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
......
package com.sobot.utils;
package com.sobot.common.utils;
import android.content.Context;
import android.os.Build;
......
......@@ -12,7 +12,7 @@ task androidSourcesJar(type: Jar) {
ext {
PUBLISH_GROUP_ID = "com.sobot.library" //项目包名
PUBLISH_ARTIFACT_ID = 'utils' //项目名
PUBLISH_VERSION = '1.0.2' //版本号
PUBLISH_VERSION = '1.0.4' //版本号
}
......
package com.sobot.utils;
import android.app.Activity;
import android.content.Context;
import java.util.LinkedList;
import java.util.List;
/**
* @Description: 全局上下文
* @Author: znw
* @Date: 2021/7/19 下午2:17
* @Version: 1.0
*/
public class SobotGlobalContext {
private Context mApplicationContext;
private List<Activity> activityList = new LinkedList<Activity>();
private SobotGlobalContext() {
}
public static SobotGlobalContext getInstance(Context context) {
if (SobotGlobalContext.GlobalContext.globalContext.mApplicationContext == null && context != null) {
SobotGlobalContext.GlobalContext.globalContext.mApplicationContext = context;
}
return SobotGlobalContext.GlobalContext.globalContext;
}
public static Context getAppContext(Context context) {
if (SobotGlobalContext.GlobalContext.globalContext.mApplicationContext == null && context != null) {
SobotGlobalContext.GlobalContext.globalContext.mApplicationContext = context.getApplicationContext();
}
return SobotGlobalContext.GlobalContext.globalContext.mApplicationContext;
}
public static Context getAppContext() {
return SobotGlobalContext.GlobalContext.globalContext.mApplicationContext;
}
private static class GlobalContext {
private static final SobotGlobalContext globalContext = new SobotGlobalContext();
private GlobalContext() {
}
}
// 添加activity到容器中
public void addActivity(Activity aty) {
activityList.add(aty);
}
/*退出时关闭所有的activity*/
public void exit() {
for (Activity activity : activityList) {
activity.finish();
}
}
/*获取智齿最后一个activity*/
public Activity getLastActivity() {
if (activityList != null && activityList.size() > 0) {
return activityList.get(activityList.size() - 1);
}
return null;
}
public void deleteActivity(Activity aty) {
activityList.remove(aty);
}
}
\ No newline at end of file
package com.sobot.utils;
import android.content.Context;
/**
* @Description: Sobot 工具类
* @Author: znw
* @Date: 2021/7/19 下午2:41
* @Version: 1.0
*/
public class SobotUtils {
/**
* 工具类初始化
*
* @param context
*/
public static void init(Context context) {
if (context == null) {
SobotLogUtils.e("SobotUtils init: context is null, please check!");
} else {
Context applicationContext = context.getApplicationContext();
SobotGlobalContext.getInstance(applicationContext);
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment