在Android中用广播监听AccessibilityService的开启状态并更新UI界面

版权声明:本文为博主原创文章,若要转载,请注明出处。 https://blog.csdn.net/huang826336127/article/details/80139543

创建服务

既然要用服务来更新UI界面,理所当然需要一个服务。在MainActivity.java所在目录下创建以下文件

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;

public class TestService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

    }

    @Override
    public void onInterrupt() {

    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

注册服务

现在已经拥有一个服务,但还不能运行它,要在AndroidManifest.xml中注册它

<service
    android:name=".TestService"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService"/>
    </intent-filter>
    ......
</service>

声明广播对象

现在服务能正常开启和关闭了,但是需要在开启和关闭时,发送一个广播,那么,在服务文件中添加以下代码即可

import android.accessibilityservice.AccessibilityService;
import android.content.Intent;
import android.view.accessibility.AccessibilityEvent;

public class TestService extends AccessibilityService {
    //Intent构造器里面的变量是一个字符串,通常在要更新UI的文件中进行定义
    private Intent intent = new Intent(MainActivity.ACTION_SERVICE_STATE_CHANGE);

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

    }

    @Override
    public void onInterrupt() {

    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        sendAction(true);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        sendAction(false);
    }
    
    private void sendAction(boolean state) {
        intent.putExtra("state", state);
        sendBroadcast(intent);
    }
}

添加广播接收器

在MainActivity中添加一个内部类继承于BroadcastReceiver,名字随意。参考代码如下

private class ServiceStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        textView.setText(intent.getBooleanExtra("state", false) ? "服务已开启" : "服务已关闭");
    }
}

注册广播接收器

Activity的启动顺序是:onCreate()-->onStart()-->onResume()-->onStop()-->onDestory()

所以我只需要MainActivity.java中添加以下代码即可。参考代码如下

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION_SERVICE_STATE_CHANGE);
    registerReceiver(new MainActivity.ServiceStateReceiver(), filter);
}

参考代码

public class MainActivity extends AppCompatActivity {
    public static final String ACTION_SERVICE_STATE_CHANGE = "ACTION_SERVICE_STATE_CHANGE";
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView=findViewById(R.id.textView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_SERVICE_STATE_CHANGE);
        registerReceiver(new MainActivity.ServiceStateReceiver(), filter);
    }

    private class ServiceStateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            textView.setText(intent.getBooleanExtra("state", false) ? "服务已开启" : "服务已关闭");
        }
    }
}

到这里已经大功告成了,你们可以看到当我们开启关闭服务之后返回主页,页面上的TextView的文字内容已经根据广播内容发生了改变

参考资料:

Android中服务的使用方法service和使用广播更新ui界面

猜你喜欢

转载自blog.csdn.net/huang826336127/article/details/80139543
今日推荐