前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用无障碍服务(AccessibilityService)批量清理后台进程

利用无障碍服务(AccessibilityService)批量清理后台进程

作者头像
续写经典
发布2018-08-28 15:19:37
1.7K0
发布2018-08-28 15:19:37
举报
文章被收录于专栏:Android随笔

Demo地址:https://github.com/qyxxjd/ClearProcesses

AccessibilityService
1.简介
代码语言:javascript
复制
public abstract class AccessibilityService extends Service

java.lang.Object
 ↳ android.content.Context
   ↳ android.content.ContextWrapper
     ↳ android.app.Service
       ↳ android.accessibilityservice.AccessibilityService

无障碍服务旨在帮助身心有障碍的用户使用Android设备和应用。无障碍服务在后台运行,当无障碍事件被激活时系统会执行AccessibilityServiceonAccessibilityEvent(AccessibilityEvent event)方法。这些事件表示在用户界面中的一些状态的改变,例如:焦点的改变、按钮被点击等。这类服务可以有选择性地请求查询活动窗口的内容。无障碍服务的开发需要继承AccessibilityService和实现它的抽象方法。

2.使用
代码语言:javascript
复制
public class YourService extends AccessibilityService {
    @Override public void onAccessibilityEvent(final AccessibilityEvent event) {
        //TODO ...
    }
    @Override public void onInterrupt() { 
        //TODO ...
    }
}

onAccessibilityEvent方法中,通过AccessibilityEventgetSource方法获取AccessibilityNodeInfoUI节点信息

代码语言:javascript
复制
AccessibilityNodeInfo nodeInfo = event.getSource();

通过AccessibilityNodeInfofindAccessibilityNodeInfosByTextfindAccessibilityNodeInfosByViewId方法获取你感兴趣的UI子节点信息

代码语言:javascript
复制
List<AccessibilityNodeInfo> nodeInfoList = event.getSource().findAccessibilityNodeInfosByText("强行停止");

通过AccessibilityNodeInfoperformAction方法来模拟用户点击事件

代码语言:javascript
复制
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);

使用AccessibilityService之前需要判断一下当前是否已经授权

代码语言:javascript
复制
private boolean checkEnabledAccessibilityService() {
    List<AccessibilityServiceInfo> accessibilityServices =
            mAccessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
    for (AccessibilityServiceInfo info : accessibilityServices) {
        if (info.getId().equals(SERVICE_NAME)) {
            return true;
        }
    }
    return false;
}

如果没有授权,需要到系统设置页面进行设置

代码语言:javascript
复制
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);
3.属性配置

在资源文件res目录下新建一个xml文件夹,创建AccessibilityService配置文件your_config.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/app_name"
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
    android:packageNames="com.android.settings"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:notificationTimeout="500"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    />

属性名称

属性简介

android:accessibilityEventTypes

指定我们在监听窗口中可以模拟哪些事件

android:accessibilityFeedbackType

指定无障碍服务的反馈方式

android:accessibilityFlags

指定额外的标志

android:canRetrieveWindowContent

指定是否允许我们的程序读取窗口中的节点和内容

android:description

系统设置无障碍页面显示的选项名称

android:notificationTimeout

两个相同类型事件发送的时间间隔,单位毫秒

android:packageNames

指定监听的应用程序包名,多个以,隔开

更多属性介绍请参考:AccessibilityServiceInfo

4.AndroidManifest配置
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ... >

    <application ...>
        ...
        <service
            android:name=".YourService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <-- 需要用到BIND_ACCESSIBILITY_SERVICE这个权限 -->
            <intent-filter>
                <-- 有了这个action,用户才能在设置里面看到我们的服务 -->
                <action android:name="android.accessibilityservice.AccessibilityService"/>
            </intent-filter>
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/your_config"/>
        </service>
    ...
    </application>

</manifest>
清理后台进程
1.获取后台进程

通过ActivityManagergetRunningAppProcessesgetRunningServices方法获取后台运行的应用程序、服务列表

代码语言:javascript
复制
ActivityManager mActivityManager = (ActivityManager) mAppContext.getSystemService(Context.ACTIVITY_SERVICE);
//返回在设备上运行的应用程序的进程的列表
List<ActivityManager.RunningAppProcessInfo> appProcessInfos = mActivityManager.getRunningAppProcesses();
//返回当前正在运行的服务的列表
List<ActivityManager.RunningServiceInfo> serviceInfos = mActivityManager.getRunningServices(yourCount);
2.进入应用程序详情页面
代码语言:javascript
复制
private void showPackageDetail(String packageName){
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    Uri uri = Uri.fromParts(PACKAGE, packageName, null);
    intent.setData(uri);
    startActivity(intent);
}
3.模拟强行停止操作
代码语言:javascript
复制
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onAccessibilityEvent(final AccessibilityEvent event) {
    if(null == event || null == event.getSource()) { return; }
    if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED &&
            event.getPackageName().equals(PACKAGE)){
        final CharSequence className = event.getClassName();
        if(className.equals(NAME_APP_DETAILS)){ //模拟点击强行停止按钮
            simulationClick(event, TEXT_FORCE_STOP);
            performGlobalAction(GLOBAL_ACTION_BACK);
        }
        if(className.equals(NAME_ALERT_DIALOG)){ //模拟点击弹窗的确认按钮
            simulationClick(event, TEXT_DETERMINE);
            performGlobalAction(GLOBAL_ACTION_BACK);
        }
    }
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void simulationClick(AccessibilityEvent event, String text){
    List<AccessibilityNodeInfo> nodeInfoList = event.getSource().findAccessibilityNodeInfosByText(text);
    for (AccessibilityNodeInfo node : nodeInfoList) {
        if (node.isClickable() && node.isEnabled()) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.08.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AccessibilityService
    • 1.简介
      • 2.使用
        • 3.属性配置
          • 4.AndroidManifest配置
          • 清理后台进程
            • 1.获取后台进程
              • 2.进入应用程序详情页面
                • 3.模拟强行停止操作
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档