关于Activity和View介绍,反射使用

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;

    //前台Activity数量
    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) {
        //过滤掉ZyActivity
        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) {
        //过滤ZyActivity!
        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);
//            adClickEnterGameActivity();
        } else {
            //不为0  同时没有发送过,才发送
            if (!mSend) {
                mSend = true;
                //首次打开,不发送
                if (mIsFirstSend) {
                    mIsFirstSend = false;
                    return;
                }
                Log.i("进入游戏前台 ...");
                Intent intent = new Intent();
                intent.setAction(Constants.ACTION_FOREGROUND);
                context.sendBroadcast(intent);
            }
        }
    }

    //拉起activity
    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);
//                for (View view1 : views) {
//                }
                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()) {
                // 返回第一个找到的入口 Activity
                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())) {
                // 查找包含 MAIN 和 LAUNCHER 的 intent-filter
                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);
                        
                        // 检查 intent-filter
                        int depth = parser.getDepth();
                        while (parser.next() != XmlPullParser.END_TAG 
                                || parser.getDepth() > depth) {
                            if (parser.getEventType() == XmlPullParser.START_TAG 
                                    && "intent-filter".equals(parser.getName())) {
                                
                                // 检查 action 和 category
                                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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值