版权声明:本文为博主原创文章,若要转载,请注明出处。 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的文字内容已经根据广播内容发生了改变