How can I programmatically start and stop an Acces

2020-07-18 05:09发布

Background

I have an app that has an AccessibilityService. Android seems to keep AccessibilityServices running all the time, but I only need mine to run sometimes. (Specifically, if a user opens my app and turns it off, the AccessibilityService is no longer needed.)

If my AccessibilityService is running when it isn't needed, it's wasting the device's RAM and CPU, and I want to avoid doing this to my users if possible.

Question

How can I programmatically start and stop my AccessibilityService?

Note that I am not asking to programmatically enable or disable the AccessibilityService in Android's accessibility settings; this is just about starting and stopping it when it's already enabled.

What I've tried (stopping the AccessibilityService)

Related questions

2条回答
迷人小祖宗
2楼-- · 2020-07-18 05:32

Taken from the Lifecycle section of the AccessibilityService documentation:

The lifecycle of an accessibility service is managed exclusively by the system and follows the established service life cycle. Starting an accessibility service is triggered exclusively by the user explicitly turning the service on in device settings. After the system binds to a service, it calls onServiceConnected(). This method can be overriden by clients that want to perform post binding setup.

An accessibility service stops either when the user turns it off in device settings or when it calls disableSelf() (In Android 7.0 (API 24) and later).

查看更多
别忘想泡老子
3楼-- · 2020-07-18 05:38

As stated in Sam's answer, the lifecycle of an AccessibilityService is managed exclusively by the system, so you can't kill it.

But apart resource optimization aims, if you still need to start/stop the AccessibilityService from operating in some circumstances, you can simply use the good old SharedPreferences.

Your Service's onAccessibilityEvent should be:

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    if (prefs.getBoolean("isServiceEnabled", true)){
        /*
        * Your code goes here
        */
    }
}

When you want to "switch off/on" the service you can do it by simply writing this in some button's onClickListener or somewhere else according to your needs:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

prefs.edit().putBoolean("isServiceEnabled", false).apply(); // disable

prefs.edit().putBoolean("isServiceEnabled", true).apply();  // enable
查看更多
登录 后发表回答