【Android】拦截Activity启动的方法

1、源码寻找启动Activity的Hook的对象

一般来说,静态变量和单列变量是相对不容改变,是比较好的Hook的对象,可以设一个动态代理对象进去,进行拦截。

启动一个页面:

public void start(View view) {
   
        Intent intent = new Intent(this, HookActivity.class);
        startActivity(intent);
}

追溯到ContextImpl:

@Override
public void startActivity(Intent intent, Bundle options) {
   
    mMainThread.getInstrumentation().execStartActivity(
            getOuterContext(), mMainThread.getApplicationThread(), null,
            (Activity) null, intent, -1, options);
}

回到Instrumentation:

public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
   
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    Uri referrer = target != null ? target.onProvideReferrer() : null;
    if (referrer != null) {
   
        intent.putExtra(Intent.EXTRA_REFERRER, referrer);
    }
    ...
    try {
   
        intent.migrateExtraStreamToClipData();
        intent.prepareToLeaveProcess(who);
        int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以使用 ActivityManager 监听 Activity启动情况,并在需要的时候拦截某个 Activity启动。具体步骤如下: 1. 在 AndroidManifest.xml 中注册一个监听器服务。 ```xml <service android:name=".MyService"> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </service> ``` 2. 创建一个 Service 类,并在其中实现一个继承自 Binder 的内部类 MyBinder。 ```java public class MyService extends Service { private MyBinder binder = new MyBinder(); public class MyBinder extends Binder { public void intercept(String packageName, String activityName) { // 在这里实现拦截逻辑 } } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } } ``` 3. 在 MyBinder 的 intercept 方法中,通过 ActivityManager 监听 Activity启动情况,并在需要的时候拦截某个 Activity启动。 ```java public void intercept(String packageName, String activityName) { final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); activityManager.addOnBackStackChangedListener(new ActivityManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { String currentPackageName = ""; String currentActivityName = ""; if (activityManager.getRunningTasks(1).size() > 0) { ComponentName componentName = activityManager.getRunningTasks(1).get(0).topActivity; currentPackageName = componentName.getPackageName(); currentActivityName = componentName.getClassName(); } if (currentPackageName.equals(packageName) && currentActivityName.equals(activityName)) { // 拦截逻辑 } } }); } ``` 注意,为了保证拦截的准确性,需要在拦截逻辑中判断当前启动Activity 是否是需要拦截Activity。在上面的代码中,通过比较包名和类名的方式来判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值