一、去掉广告页
1.需求分析
常用命令
查看最前端的Activity是谁
adb shell dumpsys activity activities
或者
dumpsys activity activities | grep "Resumed"
因为Resumed是头部activity,即当前页面的activity
例如出现下面情况 (搜狗设置输入法的界面,还没应用,类似于广告页)
topResumedActivity=ActivityRecord{ed8ed4d u0 com.sohu.inputmethod.sogou/com.sogou.userguide.SettingGuideActivity t20} Resumed activities in task display areas (from top to bottom): Resumed: ActivityRecord{ed8ed4d u0 com.sohu.inputmethod.sogou/com.sogou.userguide.SettingGuideActivity t20} ResumedActivity: ActivityRecord{ed8ed4d u0 com.sohu.inputmethod.sogou/com.sogou.userguide.SettingGuideActivity t20}
com.sohu.inputmethod.sogou/com.sogou.userguide.SettingGuideActivity
主页面
topResumedActivity=ActivityRecord{8f8e7b u0 com.sohu.inputmethod.sogou/.SogouIMEHomeActivity t20}
Resumed activities in task display areas (from top to bottom): Resumed: ActivityRecord{8f8e7b u0 com.sohu.inputmethod.sogou/.SogouIMEHomeActivity t20} ResumedActivity: ActivityRecord{8f8e7b u0 com.sohu.inputmethod.sogou/.SogouIMEHomeActivity t20}
com.sohu.inputmethod.sogou/.SogouIMEHomeActivity
2.方案选择
2.1
dumpsys 发现广告页和主页面不是一个Activity,广告页面是第一个启动页面,然后会跳转主页面
按照 应用层 - 应用框架(Activity) - system server 顺序来,能上层解决就上层解决
应用层:即启动广告页面的是Launcher这个应用(把应用放在桌面),故是否可以考虑Launcher中修改?
这样修改会有什么考虑不全的问题吗?
1、启动应用不一定在框架(Launcher桌面启动),在其他应用商店都是可以的
2、Launcher有可能安装第三方的(应用在应用宝啊,软件商店啊,启动)
应用框架:基本可以覆盖所有情况
优点:简单快捷,可以较快实现功能
缺点:有可能破坏一些应用的初始化时序,故可能该方案不能覆盖针对所有带广告应用
修改路径
frameworks\base\core\java\android\app\Activity.java
在public void startActivity(Intent intent, @Nullable Bundle options)
这个方法里面修改,修改内容如下:
// 第一个参数是包名,第二个是类名
ComponentName srcCom = new ComponenName("com.sohu.inputmethod.sogou","com.sohu.inputmethod.sogou.com.sogou.userguide.SettingGuideActivity");
ComponentName desCom = new ComponenName("com.sohu.inputmethod.sogou","com.sohu.inputmethod.sogou.SogouIMEHomeActivity");
if(intent.getComponent() != null && intent.getComponent().equals(srcCom)){
itent.setComponent(desCom);
}
2.2
发现广告页面一般会有一个跳过按钮
是否可以考虑在广告Activty模拟一个触摸点击跳过
优点:最大限度保证带广告自身逻辑
缺点:还是可以看到短暂广告,而且每个应用不一定都有跳过,而且跳过按钮可能不一定位置一样,导致也无法满足覆盖所有应用,需要挨个适配
这个方法流程比较麻烦,需要适配,只能说还有这个方法,具体怎么操作还需要诸君针对应用尝试了
二、拓展
当然,如果可以拦截广告页面的话,那是不是也可以拦截应用的启动呢
比如拦截支付宝
获取包名
S5:/ $ dumpsys activity activities | grep "Resumed" topResumedActivity=ActivityRecord{83091af u0 com.eg.android.AlipayGphone/.AlipayLogin t13} Resumed activities in task display areas (from top to bottom): Resumed: ActivityRecord{83091af u0 com.eg.android.AlipayGphone/.AlipayLogin t13} ResumedActivity: ActivityRecord{83091af u0 com.eg.android.AlipayGphone/.AlipayLogin t13}
在一样的地方修改内容如下,即可实现拦截应用启动的功能了
ComponentName targetCom = new ComponentName("com.eg.android.AlipayGphone", "com.eg.android.AlipayGphone.AlipayLogin");
if (intent.getComponent() != null && intent.getComponent().equals(targetCom)) {
intent.setComponent(null);
}