客户有个需求,在其他界面如果3分钟不操作,就自动退回主界面
查度娘后发现,AccessibilityService 大概,可能可以完成要求。
首先,建立服务:
public class MonitorTouchService extends AccessibilityService {
private String TAG = "AliAccessibilityService";
public static MonitorTouchService mService;
private BackMain backMain;
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d(TAG, "into onServiceConnected");
mService = this;
backMain = new BackMain(3 * 60 * 1000, 1000, this);
backMain.start();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d(TAG, "into onAccessibilityEvent==>>"+event.getEventType());
backMain.cancel();
backMain.start();
}
@Override
public void onInterrupt() {
Log.d(TAG, "onInterrupt");
mService = null;
backMain.cancel();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
mService = null;
backMain.cancel();
}
/**
* 辅助功能是否启动
*/
public static boolean isStart() {
return mService != null;
}
}
定时类 BackMain 实现:
public class BackMain extends CountDownTimer {
private static final String TAG = "BackMain";
private Context context;
/**
* 参数 millisInFuture 倒计时总时间(如60S,120s等)
* 参数 countDownInterval 渐变时间(每次倒计1s)
*/
public BackMain(long millisInFuture, long countDownInterval, Context context) {
super(millisInFuture, countDownInterval);
this.context = context;
}
// 计时完毕时触发
@Override
public void onFinish() {
Log.d(TAG, "时间到。。。");
Intent anotherIntent = new Intent();
anotherIntent.setComponent(new ComponentName("com.joson.adphonelauncher", "com.joson.adphonelauncher.MainActivity"));
context.startActivity(anotherIntent);
}
// 计时过程显示
@Override
public void onTick(long millisUntilFinished) {
//Log.d(TAG, "onTick==>>" + millisUntilFinished);
}
}
2、注册服务:
<service
android:name=".MonitorTouchService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice" />
</service>
accessibilityservice.xml 文件实现:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged|typeViewHoverEnter|typeViewHoverExit"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagIncludeNotImportantViews"
android:canRequestFilterKeyEvents="true"
android:canRetrieveWindowContent="true"
android:description="@string/app_name" />
3、开启程序的辅助模式:
if (!isAccessibilitySettingsOn(this)) {
try {
startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
} catch (Exception e) {
startActivity(new Intent(Settings.ACTION_SETTINGS));
e.printStackTrace();
}
}
isAccessibilitySettingsOn :
private String service = "com.joson.adphonelauncher/com.joson.adphonelauncher.fkey.FloatKeyService";
public boolean isAccessibilitySettingsOn(Context mContext) {
int accessibilityEnabled = 0;
try {
accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
if (accessibilityEnabled == 1) {
String settingValue = Settings.Secure.getString(mContext.getApplicationContext().getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (settingValue != null) {
mStringColonSplitter.setString(settingValue);
while (mStringColonSplitter.hasNext()) {
String accessibilityService = mStringColonSplitter.next();
if (accessibilityService.equalsIgnoreCase(service)) {
return true;
}
}
}
}
return false;
}
参考:
https://blog.csdn.net/qq_24531461/article/details/53884538