使用AccessibilityService实现APP的自动安装与卸载

本文介绍如何使用Android的AccessibilityService实现APP的自动安装与卸载。通过监听和模拟用户操作,AccessibilityService可以在后台捕获并响应事件,如卸载应用时的点击事件。文中提供了一个Demo,展示了如何在特定应用界面找到并模拟点击按钮来执行卸载操作。
摘要由CSDN通过智能技术生成

使用AccessibilityService实现APP的自动安装与卸载

 

  作者:

  蒋东国

  时间:

  2016年12月6日 星期二

  应用来源:

  hqt APP(测试机型:三星 Note4)          

  博客地址:

 http://blog.csdn.net/andrexpert/article/details/53494776

      

 情景再现“平时在使用豌豆荚或者360手机助手下载软件时,我们可以设置软件静默安装和智能安装,这两种情况允许用户无需操作任何界面就能够实现软件的一键下载安装,用户体验大大提高。我们知道静默安装主要是针对于已经Root的手机,只需执行相关的shell命令即可实现,那么,智能安装又是怎么一回事呢?”

      

 从Google官方文档来看,AccessibilityService主要用于开发者为其应用开发一些增强用户体验的功能(辅助功能),比如语音合成、手势导航,甚至可以获得当前活动窗口的内容并模拟用户进行文本输入、Button点击操作等等,可以说功能非常强(从安全的角度来说,一般不建议开启某些应用的AccessibilityService)。从Accessibility-Service.java源码可知,AccessibilityService继承于Service并且采用bind方式启动,因此AccessibilityService的生命周期遵循Service的生命周期,不同的是它仅由系统管理,AccessibilityService的开启、关闭必须由用户自己到”设置(settings)”界面开启。除了应用进程被非正常终止或者被卸载,AccessibilityService被开启后会一直保持着开启的状态。AccessibilityService.java部分源码:

public abstract class AccessibilityService extendsService {
public abstract voidonAccessibilityEvent(AccessibilityEvent event);
 …..
@Override
public final IBinder onBind(Intent intent) {
     returnnew IAccessibilityServiceClientWrapper(this, getMainLooper(), new Callbacks() {
    @Override
     publicvoid onServiceConnected() {
         AccessibilityService.this.onServiceConnected();
      }
  @Override
      publicvoid onAccessibilityEvent(AccessibilityEvent event) {
          AccessibilityService.this.onAccessibilityEvent(event);
      }
          ……
     });
  }
}

1.建立AccessibilityService

 实现一个AccessibilityService子类,并重写如下方法:onServiceConnected()(当系统成功启动服务时调用,可用于对服务进行配置或弹出提示信息)、onAccessibilityEvent(AccessibilityEvent event)(当指定事件出发该服务时调用,用于实现事件处理的业务逻辑模块)、onInterrupt()(终止accessibility service时调用)。

      

 @Override
       protected voidonServiceConnected() {
              super.onServiceConnected();
              //系统启动服务成功,弹出提示信息
              Toast.makeText(UnAccessibilityService.this,"连接服务成功",
                                          Toast.LENGTH_SHORT).show();
       }
 
       @Override
       public voidonAccessibilityEvent(AccessibilityEvent event) {
              Log.d("sms","onAccessibilityEvent被调用");
              //卸载事件捕获,调用应用卸载方法
              uninstallApplication(event,”确定”);
       }

  那么问题来了,当用户点击一个Button实现卸载功能时,AccessibilityService是如何捕获点击事件并执行卸载任务的?这就借助于另外两个类:AccessibilityNodeInfo、AccessibilityEvent。AccessibilityEvent封装了所有用户触发的事件,这些事件将由系统发送给AccessibilityService;然后,AccessibilityService再根据/res/xml/accessibility_service_config.xml中的android:accessibilityEventTypes 属性确定是否对该事件进行捕获,由于这里将该属性值设置为” typeAllMask”,我们定义的AccessibilityService将对用户操作的所有事件进行捕获。而AccessibilityNodeInfo则封装了当前状态视图的属性,即当前状态视图组件以树的形式构建。

  接下来,我们将借助Accessibility Service模拟用户完成点击操作,实现应用的卸载。由于系统卸载应用调用的是包名为” com.android.p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值