提交 0f566fd3 编写于 作者: B Blankj

see 04/08 log

上级 377f063e
......@@ -96,7 +96,6 @@ public class ActivityActivity extends BaseBackActivity {
.appendLine("isActivityExists: " + ActivityUtils.isActivityExists(Config.PKG, SubActivityActivity.class.getName()))
.appendLine("getLauncherActivity: " + ActivityUtils.getLauncherActivity(Config.PKG))
.appendLine("getTopActivity: " + ActivityUtils.getTopActivity())
.appendLine("getTopActivity: " + ActivityUtils.getTopActivity())
.appendLine("isActivityExistsInStack: " + ActivityUtils.isActivityExistsInStack(CoreUtilActivity.class))
.append("getActivityIcon: ")
.appendImage(ActivityUtils.getActivityIcon(ActivityActivity.class), SpanUtils.ALIGN_CENTER)
......
......@@ -25,6 +25,21 @@ copyIntent: 复制意图到剪贴板
getIntent : 获取剪贴板的意图
```
* ### 克隆相关 -> [CloneUtils.java][clone.java] -> [Test][clone.test]
```
deepClone: 深度克隆
```
* ### 坐标转换相关 -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02 : BD09 坐标转 GCJ02 坐标
gcj02ToBd09 : GCJ02 坐标转 BD09 坐标
gcj02ToWGS84: GCJ02 坐标转 WGS84 坐标
wgs84ToGcj02: WGS84 坐标转 GCJ02 坐标
bd09ToWGS84 : BD09 坐标转 WGS84 坐标
wgs84ToBd09 : WGS84 坐标转 BD09 坐标
```
* ### Gson 相关 -> [GsonUtils.java][gson.java] -> [Test][gson.test]
```
getGson : 获取 Gson 对象
......@@ -84,6 +99,12 @@ scheduleWithFixedDelay: 延迟并以固定休息时间循环执行命令
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/CloneUtilsTest.java
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[gson.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/GsonUtils.java
[gson.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/GsonUtilsTest.java
......
......@@ -25,6 +25,21 @@ copyIntent
getIntent
```
* ### About Clone -> [CloneUtils.java][clone.java] -> [Test][clone.test]
```
deepClone
```
* ### About Coordinate -> [CoordinateUtils.java][coordinate.java] -> [Test][coordinate.test]
```
bd09ToGcj02
gcj02ToBd09
gcj02ToWGS84
wgs84ToGcj02
bd09ToWGS84
wgs84ToBd09
```
* ### About Gson -> [GsonUtils.java][gson.java] -> [Test][gson.test]
```
getGson
......@@ -84,6 +99,12 @@ scheduleWithFixedDelay
[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/ClipboardUtils.java
[clipboard.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/ClipboardUtilsTest.java
[clone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/CloneUtils.java
[clone.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/CloneUtilsTest.java
[coordinate.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/CoordinateUtils.java
[coordinate.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/CoordinateUtilsTest.java
[gson.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/main/java/com/blankj/subutil/util/GsonUtils.java
[gson.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/subutil/src/test/java/com/blankj/subutil/util/GsonUtilsTest.java
......
......@@ -7,10 +7,10 @@ import static java.lang.Math.PI;
* author: Blankj
* blog : http://blankj.com
* time : 2018/03/21
* desc : 坐标转换工具类
* desc : 坐标相关工具类
* </pre>
*/
public final class CoordinateConvertUtils {
public final class CoordinateUtils {
private final static double X_PI = 3.14159265358979324 * 3000.0 / 180.0;
private final static double A = 6378245.0;
......@@ -73,7 +73,7 @@ public final class CoordinateConvertUtils {
}
/**
* WGS84 坐标 转 GCJ02 坐标
* WGS84 坐标转 GCJ02 坐标
*
* @param lng WGS84 坐标经度
* @param lat WGS84 坐标纬度
......@@ -97,7 +97,7 @@ public final class CoordinateConvertUtils {
}
/**
* BD09 坐标 转 WGS84 坐标
* BD09 坐标转 WGS84 坐标
*
* @param lng BD09 坐标经度
* @param lat BD09 坐标纬度
......@@ -137,14 +137,7 @@ public final class CoordinateConvertUtils {
return ret;
}
/**
* 判断坐标是否不在国内
*
* @param lng 经度
* @param lat 纬度
* @return 坐标是否在国内
*/
public static boolean outOfChina(double lng, double lat) {
private static boolean outOfChina(double lng, double lat) {
return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;
}
}
......@@ -2,49 +2,27 @@ package com.blankj.subutil.util;
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.support.annotation.NonNull;
/**
* <pre>
* author: Blankj
* author:
* ___ ___ ___ ___
* _____ / /\ /__/\ /__/| / /\
* / /::\ / /::\ \ \:\ | |:| / /:/
* / /:/\:\ ___ ___ / /:/\:\ \ \:\ | |:| /__/::\
* / /:/~/::\ /__/\ / /\ / /:/~/::\ _____\__\:\ __| |:| \__\/\:\
* /__/:/ /:/\:| \ \:\ / /:/ /__/:/ /:/\:\ /__/::::::::\ /__/\_|:|____ \ \:\
* \ \:\/:/~/:/ \ \:\ /:/ \ \:\/:/__\/ \ \:\~~\~~\/ \ \:\/:::::/ \__\:\
* \ \::/ /:/ \ \:\/:/ \ \::/ \ \:\ ~~~ \ \::/~~~~ / /:/
* \ \:\/:/ \ \::/ \ \:\ \ \:\ \ \:\ /__/:/
* \ \::/ \__\/ \ \:\ \ \:\ \ \:\ \__\/
* \__\/ \__\/ \__\/ \__\/
* blog : http://blankj.com
* time : 16/12/08
* desc : Utils初始化相关
* desc : utils about initialization
* </pre>
*          瓦瓦            十
*         十齱龠己         亅瓦車己
*         乙龍龠毋日丶      丶乙己毋毋丶
*         十龠馬鬼車瓦      己十瓦毋毋
*          鬼馬龠馬龠十    己己毋車毋瓦
*          毋龠龠龍龠鬼乙丶丶乙車乙毋鬼車己
*          乙龠龍龍鬼龍瓦 十瓦毋乙瓦龠瓦亅
*           馬齱龍馬鬼十丶日己己己毋車乙丶
*           己齱馬鬼車十十毋日乙己己乙乙
*            車馬齱齱日乙毋瓦己乙瓦日亅
*            亅車齺龖瓦乙車龖龍乙乙十
*             日龠龠十亅車龍毋十十
*             日毋己亅 己己十亅亅
*            丶己十十乙  丶丶丶丶丶
*            亅己十龍龖瓦  丶 丶 乙十
*            亅己十龠龖毋 丶丶  丶己鬼鬼瓦亅
*            十日十十日亅丶亅丶 丶十日毋鬼馬馬車乙
*            十日乙十亅亅亅丶  十乙己毋鬼鬼鬼龍齺馬乙
*            丶瓦己乙十十亅丶亅乙乙乙己毋鬼鬼鬼龍齱齺齺鬼十
*             乙乙十十十亅乙瓦瓦己日瓦毋鬼鬼龠齱齱龍龍齱齱毋丶
*             亅十十十十乙瓦車毋瓦瓦日車馬龠龍龍龍龍龍龠龠龠馬亅
*              十十十十己毋車瓦瓦瓦瓦鬼馬龠龍龠龠龍龠龠龠馬龠車
*               亅十十日毋瓦日日瓦鬼鬼鬼龠龠馬馬龠龍龍龠馬馬車
*               亅亅亅乙瓦瓦毋車車車馬龍龠鬼鬼馬龠龍龍龠馬馬鬼
*             丶丶乙亅亅乙車鬼鬼鬼毋車龍龍龠鬼馬馬龠龍齱齱龍馬鬼
*            亅己十十己十日鬼鬼車瓦毋龠龍龠馬馬龠龠龠齱齺齺齱龠鬼
*             亅乙乙乙十車馬車毋馬齱齱龍龠龠龠馬龠龍齱龍龠龠鬼瓦
*                 丶毋龠鬼車瓦車馬龠龍龠龠龍齱齱龠馬馬鬼毋日
*                 十乙己日十  丶己鬼龍齱齺齱龍馬馬馬車毋己
*               丶十己乙亅丶      亅瓦馬龠龍龠龠馬毋瓦乙
*              丶十十乙亅十        亅己瓦車馬龠鬼車瓦乙
*              丶十乙十十丶         丶丶亅十瓦鬼車瓦己
*               丶亅亅丶               亅日瓦日
*                                     丶
*/
public final class Utils {
......@@ -56,18 +34,29 @@ public final class Utils {
}
/**
* 初始化工具类
* Init utils.
* <p>Init it in the class of Application.</p>
*
* @param app 应用
* @param context context
*/
public static void init(@NonNull final Context context) {
init((Application) context.getApplicationContext());
}
/**
* Init utils.
* <p>Init it in the class of Application.</p>
*
* @param app application
*/
public static void init(@NonNull final Application app) {
Utils.sApplication = app;
}
/**
* 获取 Application
* Return the context of Application object.
*
* @return Application
* @return the context of Application object
*/
public static Application getApp() {
if (sApplication != null) return sApplication;
......
package com.blankj.subutil.util;
import org.junit.Assert;
import org.junit.Test;
import java.io.Serializable;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2018/04/08
* desc : test CloneUtils
* </pre>
*/
public class CloneUtilsTest {
@Test
public void deepClone() throws Exception {
Person person = new Person("Blankj");
Person clonePerson = CloneUtils.deepClone(person);
System.out.println(person);
System.out.println(clonePerson);
Assert.assertNotEquals(person, clonePerson);
}
static class Person implements Serializable {
String name;
int gender;
String address;
public Person(String name) {
this.name = name;
this.gender = gender;
this.address = address;
}
@Override
public String toString() {
return "{\"name\":" + name + ",\"gender\":" + gender + ",\"address\":" + address + "}";
}
}
}
\ No newline at end of file
......@@ -10,10 +10,10 @@ import static java.lang.Math.PI;
* author: Blankj
* blog : http://blankj.com
* time : 2018/03/22
* desc : CoordinateConvertUtils 单元测试
* desc : CoordinateUtils 单元测试
* </pre>
*/
public class CoordinateConvertUtilsTest {
public class CoordinateUtilsTest {
// 以下为各个坐标系的 天安门坐标
private static final double[] locationWGS84 = new double[]{116.3912022800, 39.9075017400};
......@@ -25,7 +25,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void gcj2BD09() throws Exception {
double[] BD09 = CoordinateConvertUtils.gcj02ToBd09(locationGCJ02[0], locationGCJ02[1]);
double[] BD09 = CoordinateUtils.gcj02ToBd09(locationGCJ02[0], locationGCJ02[1]);
double distance = distance(locationBD09[0], locationBD09[1], BD09[0], BD09[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -33,7 +33,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void bd092GCJ() {
double[] GCJ02 = CoordinateConvertUtils.bd09ToGcj02(locationBD09[0], locationBD09[1]);
double[] GCJ02 = CoordinateUtils.bd09ToGcj02(locationBD09[0], locationBD09[1]);
double distance = distance(locationGCJ02[0], locationGCJ02[1], GCJ02[0], GCJ02[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -41,7 +41,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void bd092WGS() {
double[] WGS84 = CoordinateConvertUtils.bd09ToWGS84(locationBD09[0], locationBD09[1]);
double[] WGS84 = CoordinateUtils.bd09ToWGS84(locationBD09[0], locationBD09[1]);
double distance = distance(locationWGS84[0], locationWGS84[1], WGS84[0], WGS84[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -49,7 +49,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void wgs2BD09() {
double[] BD09 = CoordinateConvertUtils.wgs84ToBd09(locationWGS84[0], locationWGS84[1]);
double[] BD09 = CoordinateUtils.wgs84ToBd09(locationWGS84[0], locationWGS84[1]);
double distance = distance(locationBD09[0], locationBD09[1], BD09[0], BD09[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -57,7 +57,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void wgs2GCJ() {
double[] GCJ02 = CoordinateConvertUtils.wgs84ToGcj02(locationWGS84[0], locationWGS84[1]);
double[] GCJ02 = CoordinateUtils.wgs84ToGcj02(locationWGS84[0], locationWGS84[1]);
double distance = distance(locationGCJ02[0], locationGCJ02[1], GCJ02[0], GCJ02[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -65,7 +65,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void gcj2WGS() {
double[] WGS84 = CoordinateConvertUtils.gcj02ToWGS84(locationGCJ02[0], locationGCJ02[1]);
double[] WGS84 = CoordinateUtils.gcj02ToWGS84(locationGCJ02[0], locationGCJ02[1]);
double distance = distance(locationWGS84[0], locationWGS84[1], WGS84[0], WGS84[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -73,7 +73,7 @@ public class CoordinateConvertUtilsTest {
@Test
public void gcj2WGSExactly() {
double[] WGS84 = CoordinateConvertUtils.gcj02ToWGS84(locationGCJ02[0], locationGCJ02[1]);
double[] WGS84 = CoordinateUtils.gcj02ToWGS84(locationGCJ02[0], locationGCJ02[1]);
double distance = distance(locationWGS84[0], locationWGS84[1], WGS84[0], WGS84[1]);
System.out.println("distance: " + distance);
Assert.assertTrue(distance < 10);
......@@ -81,8 +81,8 @@ public class CoordinateConvertUtilsTest {
@Test
public void outOfChina() {
Assert.assertFalse(CoordinateConvertUtils.outOfChina(locationWGS84[0], locationWGS84[1]));
Assert.assertTrue(CoordinateConvertUtils.outOfChina(newyorkWGS84[0], newyorkWGS84[1]));
Assert.assertFalse(CoordinateUtils.outOfChina(locationWGS84[0], locationWGS84[1]));
Assert.assertTrue(CoordinateUtils.outOfChina(newyorkWGS84[0], newyorkWGS84[1]));
}
public static double distance(double lngA, double latA, double lngB, double latB) {
......
......@@ -9,7 +9,7 @@ import org.junit.Test;
* author: Blankj
* blog : http://blankj.com
* time : 2016/09/26
* desc : GsonUtils 单元测试
* desc : test GsonUtils
* </pre>
*/
public class GsonUtilsTest {
......@@ -40,7 +40,7 @@ public class GsonUtilsTest {
);
}
class Person {
static class Person {
String name;
int gender;
......
......@@ -5,7 +5,7 @@ package com.blankj.subutil.util;
* author: Blankj
* blog : http://blankj.com
* time : 2017/09/10
* desc :
* desc : config of test
* </pre>
*/
public class TestConfig {
......
......@@ -11,7 +11,7 @@ import org.robolectric.annotation.Config;
* author: Blankj
* blog : http://blankj.com
* time : 2016/08/21
* desc : 单元测试工具类
* desc : utils about test
* </pre>
*/
@RunWith(RobolectricTestRunner.class)
......
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
......@@ -17,10 +17,7 @@ import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.util.Pair;
import android.view.View;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
/**
* <pre>
......@@ -739,43 +736,7 @@ public final class ActivityUtils {
* @return the top activity in activity's stack
*/
public static Activity getTopActivity() {
final Activity topActivity = Utils.getActivityList().getLast();
if (topActivity != null) {
return topActivity;
}
// using reflect to get top activity
try {
@SuppressLint("PrivateApi")
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities = (Map) activitiesField.get(activityThread);
if (activities == null) return null;
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
Utils.setTopActivity(activity);
return activity;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null;
return Utils.getTopActivity();
}
/**
......@@ -1200,10 +1161,27 @@ public final class ActivityUtils {
}
}
private static Context getActivityOrApp() {
Activity topActivity = getTopActivity();
return topActivity == null ? Utils.getApp() : topActivity;
if (isAppForeground()) {
Activity topActivity = getTopActivity();
return topActivity == null ? Utils.getApp() : topActivity;
} else {
return Utils.getApp();
}
}
private static boolean isAppForeground() {
ActivityManager am =
(ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
if (am == null) return false;
List<ActivityManager.RunningAppProcessInfo> info = am.getRunningAppProcesses();
if (info == null || info.size() == 0) return false;
for (ActivityManager.RunningAppProcessInfo aInfo : info) {
if (aInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return aInfo.processName.equals(Utils.getApp().getPackageName());
}
}
return false;
}
private static void startActivity(final Context context,
......
......@@ -222,8 +222,8 @@ public final class ToastUtils {
@Override
public void run() {
cancel();
sToast = Toast.makeText(Utils.getApp(), text, duration);
TextView tvMessage = sToast.getView().findViewById(android.R.id.message);
sToast = Toast.makeText(Utils.getTopActivityOrApp(), text, duration);
final TextView tvMessage = sToast.getView().findViewById(android.R.id.message);
int msgColor = tvMessage.getCurrentTextColor();
//it solve the font of toast
TextViewCompat.setTextAppearance(tvMessage, android.R.style.TextAppearance);
......@@ -246,7 +246,7 @@ public final class ToastUtils {
@Override
public void run() {
cancel();
sToast = new Toast(Utils.getApp());
sToast = new Toast(Utils.getTopActivityOrApp());
sToast.setView(view);
sToast.setDuration(duration);
if (sGravity != -1 || sXOffset != -1 || sYOffset != -1) {
......
......@@ -8,7 +8,10 @@ import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.Map;
/**
* <pre>
......@@ -34,7 +37,7 @@ public final class Utils {
@SuppressLint("StaticFieldLeak")
private static Application sApplication;
private static LinkedList<Activity> sActivityList = new LinkedList<>();
private static final LinkedList<Activity> ACTIVITY_LIST = new LinkedList<>();
private static ActivityLifecycleCallbacks mCallbacks = new ActivityLifecycleCallbacks() {
@Override
......@@ -69,7 +72,7 @@ public final class Utils {
@Override
public void onActivityDestroyed(Activity activity) {
sActivityList.remove(activity);
ACTIVITY_LIST.remove(activity);
}
};
......@@ -84,18 +87,17 @@ public final class Utils {
* @param context context
*/
public static void init(@NonNull final Context context) {
Utils.sApplication = (Application) context.getApplicationContext();
Utils.sApplication.registerActivityLifecycleCallbacks(mCallbacks);
init((Application) context.getApplicationContext());
}
/**
* Init utils.
* <p>Init it in the class of Application.</p>
*
* @param application application
* @param app application
*/
public static void init(@NonNull final Application application) {
Utils.sApplication = application;
public static void init(@NonNull final Application app) {
Utils.sApplication = app;
Utils.sApplication.registerActivityLifecycleCallbacks(mCallbacks);
}
......@@ -111,17 +113,64 @@ public final class Utils {
static void setTopActivity(final Activity activity) {
if (activity.getClass() == PermissionUtils.PermissionActivity.class) return;
if (sActivityList.contains(activity)) {
if (!sActivityList.getLast().equals(activity)) {
sActivityList.remove(activity);
sActivityList.addLast(activity);
if (ACTIVITY_LIST.contains(activity)) {
if (!ACTIVITY_LIST.getLast().equals(activity)) {
ACTIVITY_LIST.remove(activity);
ACTIVITY_LIST.addLast(activity);
}
} else {
sActivityList.addLast(activity);
ACTIVITY_LIST.addLast(activity);
}
}
public static LinkedList<Activity> getActivityList() {
return sActivityList;
static LinkedList<Activity> getActivityList() {
return ACTIVITY_LIST;
}
static Context getTopActivityOrApp() {
Activity topActivity = getTopActivity();
return topActivity == null ? Utils.getApp() : topActivity;
}
static Activity getTopActivity() {
if (!ACTIVITY_LIST.isEmpty()) {
final Activity topActivity = ACTIVITY_LIST.getLast();
if (topActivity != null) {
return topActivity;
}
}
// using reflect to get top activity
try {
@SuppressLint("PrivateApi")
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities = (Map) activitiesField.get(activityThread);
if (activities == null) return null;
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
Utils.setTopActivity(activity);
return activity;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册