建立服务html
既然要用服务来更新UI界面,理所固然须要一个服务。在MainActivity.java所在目录下建立如下文件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中注册它android
android:name=".TestService"
android:label="@string/app_name"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
......
声明广播对象
如今服务能正常开启和关闭了,可是须要在开启和关闭时,发送一个广播,那么,在服务文件中添加如下代码便可app
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,名字随意。参考代码以下ide
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()ui
因此我只须要MainActivity.java中添加如下代码便可。参考代码以下code
@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的文字内容已经根据广播内容发生了改变xml
参考资料: