1.获取栈顶Activity
public static String getTopActivity(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
String topActivityClassName = tasks.get(0).topActivity.getClassName();
return topActivityClassName;
}
return null;
}
2.前后台切换
public final class AppLifecycleObserver implements Application.ActivityLifecycleCallbacks {
private Context context;
private Activity mActivity;
private int mFrontActivityCount = 0;
private boolean mSend = false;
private boolean mIsFirstSend = true;
private static final String ZY_ACTIVITY = "x.x.x.Activity";
public AppLifecycleObserver(Context context) {
this.context = context.getApplicationContext();
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
mActivity = activity;
AdActivity.get().setActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
if (!activity.getLocalClassName().equals(ZY_ACTIVITY)) {
mFrontActivityCount++;
post();
}
}
@Override
public void onActivityResumed(Activity activity) {
AdActivity.get().setActivity(activity);
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
if (!activity.getLocalClassName().equals(ZY_ACTIVITY)) {
mFrontActivityCount--;
if (mFrontActivityCount < 0) {
mFrontActivityCount = 0;
}
post();
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
private void post() {
if (mFrontActivityCount == 0) {
Log.i("退到后台 ...");
mSend = false;
Intent intent = new Intent();
intent.setAction(Constants.ACTION_BACKGROUND);
context.sendBroadcast(intent);
} else {
if (!mSend) {
mSend = true;
if (mIsFirstSend) {
mIsFirstSend = false;
return;
}
Log.i("进入游戏前台 ...");
Intent intent = new Intent();
intent.setAction(Constants.ACTION_FOREGROUND);
context.sendBroadcast(intent);
}
}
}
private void adClickEnterGameActivity(){
String gameLauncher = ManifestUtil.getGameActivity(mActivity);
if (StringUtil.isEmpty(gameLauncher)){
gameLauncher = "x.x.Activity";
}
ComponentName componentName = new ComponentName(mActivity.getPackageName(), gameLauncher);
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setComponent(componentName);
mActivity.startActivity(intent);
mActivity.overridePendingTransition(0, 0);
mActivity.finish();
}
application.registerActivityLifecycleCallbacks(
new AppLifecycleObserver(application.getApplicationContext()));
3.获取window的子view
private void interceptClick(Activity activity, int type) {
try {
Class<?> clazz = Class.forName("android.view.WindowManagerImpl");
Field mGlobalField = clazz.getDeclaredField("mGlobal");
mGlobalField.setAccessible(true);
WindowManager windowManager = activity.getWindowManager();
Object mGlobal = mGlobalField.get(windowManager);
if (mGlobal != null) {
Field mViewsField = mGlobal.getClass().getDeclaredField("mViews");
mViewsField.setAccessible(true);
List<View> views = (List<View>) mViewsField.get(mGlobal);
if (views != null){
interceptClickFUllPrecision((ViewGroup) views.get(views.size() - 1));
}
}
}
} catch (Exception e) {
ZyLog.showError("e:"+e);
}
}
4.反射 根据包名获取实例
private static Field[] getAllFields(Class<?> clazz) {
List<Field> fieldsList = new ArrayList<>();
while (clazz != null) {
fieldsList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
}
return fieldsList.toArray(new Field[0]);
}
public static List<String> getAllStringFields(Object obj) {
List<String> stringValues = new ArrayList<>();
Class<?> clazz = obj.getClass();
Field[] fields = getAllFields(clazz);
try {
for (Field field : fields) {
if (field.getType().equals(String.class)) {
field.setAccessible(true);
Object value = field.get(obj);
if (value instanceof String) {
stringValues.add((String) value);
}
}
}
} catch (IllegalAccessException e) {
ZyLog.showError("e ="+e);
}
return stringValues;
}
private static void adSwipeClick(View view ,View parentView){
int steps = 100;
int[] location = new int[2];
view.getLocationOnScreen(location);
int xView = location[0];
int yView = location[1];
Random random = new Random();
int startMoveX = xView + random.nextInt(view.getWidth());
int startMoveY = yView + random.nextInt(view.getHeight());
int endMoveX = startMoveX;
int endMoveY = startMoveY-400 - random.nextInt(80);
long randomInterval = 35 + random.nextInt(50);
long downTime = SystemClock.uptimeMillis();
long moveTime = downTime;
MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, startMoveX, startMoveY, 0);
parentView.dispatchTouchEvent(downEvent);
float deltaX = (float) (endMoveX - startMoveX) / steps;
float deltaY = (float) (endMoveY - startMoveY) / steps;
for (int i = 1; i <= steps; i++) {
moveTime += randomInterval;
float currentX = startMoveX + deltaX * i;
float currentY = startMoveY + deltaY * i + (float) (50 * Math.sin((Math.PI / steps) * i));
MotionEvent moveEvent = MotionEvent.obtain(moveTime, moveTime, MotionEvent.ACTION_MOVE, currentX, currentY, 0);
parentView.dispatchTouchEvent(moveEvent);
moveEvent.recycle();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
long upTime = moveTime;
MotionEvent upEvent = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP, endMoveX, endMoveY, 0);
parentView.dispatchTouchEvent(upEvent);
downEvent.recycle();
upEvent.recycle();
}
try {
Class<?> clazz = Class.forName("com.opos.mobad.model.data.AdItemData");
Object instance = clazz.getDeclaredConstructor().newInstance();
Log.i("AdActivity", "getAllStringFields: " + getAllStringFields(instance));
Log.i("AdActivity", "getAllIntFields: " + getAllIntFields(instance));
}catch (Exception e){
ZyLog.showError("e:"+e);
}
5.获取xml或者id
private RelativeLayout inflate;
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
inflate = (RelativeLayout)LayoutInflater.from(wGameActivity.get())
.inflate(ResIdHelper.get().getLayoutId("xml的layout名字"), null);
RelativeLayout frameLayout = inflate.findViewById(ResIdHelper.get().getId("id名字"));
frameLayout.addView(mBannerView);
wGameActivity.get().addContentView(inflate,layoutParams);
6.反射 通过实例对象获得类名方法名
public static String xmInter(MMFullScreenInterstitialAd mInterstitialAd){
try {
Field field = mInterstitialAd.getClass().getDeclaredField("mInterstitialAdImpl");
field.setAccessible(true);
Object impObj = field.get(mInterstitialAd);
if(impObj == null)
return "";
ZyLog.printInfo("impObj ","impObj ="+impObj.getClass().getName());
Field bField = impObj.getClass().getDeclaredField("b");
bField.setAccessible(true);
Object bObj = bField.get(impObj);
if (bObj == null)
return "";
Method hMethod = bObj.getClass().getSuperclass().getMethod("h");
Object hObj = hMethod.invoke(bObj);
if(hObj == null)
return "";
return hObj.getClass().getName();
} catch (Exception e) {
}
return "";
}
public static String test(UnifiedVivoRewardVideoAd mRewardVideoAd){
try {
Field adWrap = mRewardVideoAd.getClass().getDeclaredField("adWrap");
adWrap.setAccessible(true);
Object a_Obj = adWrap.get(mRewardVideoAd);
if(a_Obj == null)
return "";
Field B_Field = a_Obj.getClass().getDeclaredField("B");
B_Field.setAccessible(true);
SparseArray<com.vivo.mobilead.unified.reward.h> sparseArray = (SparseArray<com.vivo.mobilead.unified.reward.h>)B_Field.get(a_Obj);
if(sparseArray == null){
return "";
}
com.vivo.mobilead.unified.reward.h h = sparseArray.get(sparseArray.keyAt(0));
Field f_field = h.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("f");
f_field.setAccessible(true);
com.vivo.ad.model.b b = (com.vivo.ad.model.b) f_field.get(h);
Field stringField = b.getClass().getDeclaredField("F");
stringField.setAccessible(true);
String fieldValue = (String) stringField.get(b);
Log.i("hkReward: F_field = " + fieldValue);
} catch (Exception e) {
Log.e("hkReward: ERR" + e);
}
return "";
}
7.view的模拟点击
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
Log.printInfo( "interFull decorView name ="+decorView);
int x = decorView.getWidth() / 2;
int y = decorView.getHeight() / 2;;
int randomX = generateRandomNumber(210, 300);
int randomY = generateRandomNumber(1497, 1520);
Log.printInfo( "interFull decorView x ="+x + " y:"+y+ " randomX:"+randomX + " randomY:"+randomY);
MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(),
System.currentTimeMillis() + 100, MotionEvent.ACTION_DOWN, x, y, 0);
decorView.dispatchTouchEvent(evenDownt);
MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(),
System.currentTimeMillis() + 400, MotionEvent.ACTION_UP, x, y, 0);
decorView.dispatchTouchEvent(eventUp);
ZyLog.printInfo("interFull evenDowntX:"+ evenDownt.getX()+ " evenDowntY:"+evenDownt.getY());
evenDownt.recycle();
eventUp.recycle();
private static int generateRandomNumber(int min, int max) {
Random random = new Random();
return min + random.nextInt(max - min + 1);
}
8.res资源中获取value的值
Resources resources = context.getResources();
int resId = resources.getIdentifier("app_name", "string", context.getPackageName());
String appName = resources.getString(resId);
9.在view上做标记
ImageView redDot = new ImageView(activity);
redDot.setImageResource(android.R.drawable.presence_online);
redDot.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP | Gravity.START;
params.x = randomX - redDot.getDrawable().getIntrinsicWidth() / 2;
params.y = randomY - redDot.getDrawable().getIntrinsicHeight() / 2;
decorView.addView(redDot);
10.获取app入口activity
public static String getLauncherActivity(Context context) {
try {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage(context.getPackageName());
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
if (activities != null && !activities.isEmpty()) {
return activities.get(0).activityInfo.name;
}
} catch (Exception e) {
Log.e("UniqueIDUtils", "Error getting launcher activity", e);
}
return null;
}
public static String getLauncherActivityFromManifest(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
XmlResourceParser parser = context.getAssets()
.openXmlResourceParser("AndroidManifest.xml");
int eventType;
while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && "activity".equals(parser.getName())) {
boolean hasMain = false;
boolean hasLauncher = false;
for (int i = 0; i < parser.getAttributeCount(); i++) {
if ("name".equals(parser.getAttributeName(i))) {
String activityName = parser.getAttributeValue(i);
int depth = parser.getDepth();
while (parser.next() != XmlPullParser.END_TAG
|| parser.getDepth() > depth) {
if (parser.getEventType() == XmlPullParser.START_TAG
&& "intent-filter".equals(parser.getName())) {
int filterDepth = parser.getDepth();
while (parser.next() != XmlPullParser.END_TAG
|| parser.getDepth() > filterDepth) {
if (parser.getEventType() == XmlPullParser.START_TAG) {
if ("action".equals(parser.getName()) {
String action = parser.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"name");
if (Intent.ACTION_MAIN.equals(action)) {
hasMain = true;
}
} else if ("category".equals(parser.getName())) {
String category = parser.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"name");
if (Intent.CATEGORY_LAUNCHER.equals(category)) {
hasLauncher = true;
}
}
}
}
if (hasMain && hasLauncher) {
return activityName;
}
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}