强制停止android应用程序
打开
application details settings
使用 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
,我该如何强制停止应用程序编程?强制停止android应用程序
有两种方式,一个更粗鲁一个和更好的
好做法
如果运行
的this.finish();
方法将只有一个活动足够
如果您有多个活动运行
您必须致电this.finishAffinity();
方法。 这是在一般情况下,最好的做法,你可以同时拥有一个或多个活动
粗鲁的方式
System.Exit(0);
我加入这个只为信息,但这可能不能与多个活动的工作这不是关闭应用程序的好方法。它大部分是“保持电源按钮,直到电脑关机”。
感谢您的回复,但是我的要求是在打开App信息屏幕后强制关闭应用程序。 –
@VishalChaudhari哦,你的意思是设置中的应用程序信息屏幕?我认为应用程序内的应用程序信息屏幕对不起 –
在运行时单击另一个应用程序的元素会被视为安全威胁。你需要通过黑客才能通过这个障碍。
有一个我最近发现的黑客,你可以使用它。你可以找到源代码在这里:https://github.com/tfKamran/android-ui-automator
您可以在这里为您的应用程序添加一个模块的代码,并调用与动作com.tf.uiautomator.ACTION_CLICK_ITEM
服务,并发送你想点击作为一个额外的与关键元素的文本itemText
。
您可以使用ADB像测试:
adb shell am startservice -a com.tf.uiautomator.ACTION_CLICK_ITEM -e itemText "OK"
Thnx的答复。是的,这是解决方案之一,但这只会在根植设备中起作用。 –
噢,是的,这是一个主要的限制。 –
您可以使用Accessibility
来实现这一(但它需要Accessibility
为您的应用程序启用用户)
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//TYPE_WINDOW_STATE_CHANGED == 32
if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event
.getEventType()) {
AccessibilityNodeInfo nodeInfo = event.getSource();
if (nodeInfo == null) {
return;
}
List<AccessibilityNodeInfo> list = nodeInfo
.findAccessibilityNodeInfosByViewId("com.android.settings:id/left_button");
//We can find button using button name or button id
for (AccessibilityNodeInfo node : list) {
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
list = nodeInfo
.findAccessibilityNodeInfosByViewId("android:id/button1");
for (AccessibilityNodeInfo node : list) {
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
}
}
你可以检查一下在这个例子中: AccessibilityTestService.java
感谢您的回复,但给出的服务是用来打开应用程序的详细信息。打开屏幕后,我想以编程方式执行强制关闭操作。 –
看起来像你做错了:D检查此:http://stackoverflow.com/questions/26628262/how-to-click-button-in-settings-using-accessibilityservice –
如果你不能找到按钮id ,你可以通过文本找到它:findAccessibilityNodeInfosByText(“强制停止”) –
我发现一个解决方案为强制停止。强制停止后,我该如何返回到我的活动页面?
public class DeviceAccessibilityService extends AccessibilityService {
private static final String TAG = "litan";
private boolean isKilled = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
isKilled = false;
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event.getEventType()) {
AccessibilityNodeInfo nodeInfo = event.getSource();
Log.i(TAG, "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo);
if (nodeInfo == null) {
return;
}
List<AccessibilityNodeInfo> list = new ArrayList<>();
if ("com.android.settings.applications.InstalledAppDetailsTop".equals(event.getClassName())) {
if (Build.VERSION.SDK_INT >= 18) {
list = nodeInfo.findAccessibilityNodeInfosByViewId("com.android.settings:id/right_button");
} else if (Build.VERSION.SDK_INT >= 14) {
list = nodeInfo.findAccessibilityNodeInfosByText("com.android.settings:id/right_button");
}
for (AccessibilityNodeInfo node : list) {
Log.i(TAG, "ACC::onAccessibilityEvent: left_button " + node);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
} else if ("android.app.AlertDialog".equals(event.getClassName())) {
list = new ArrayList<>();
if (Build.VERSION.SDK_INT >= 18) {
list = nodeInfo.findAccessibilityNodeInfosByViewId("android:id/button1");
} else if (Build.VERSION.SDK_INT >= 14) {
list = nodeInfo.findAccessibilityNodeInfosByText("android:id/button1");
}
for (final AccessibilityNodeInfo node : list) {
Log.i(TAG, "ACC::onAccessibilityEvent: button1 " + node);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
//node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
return;
}
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
Log.i("Interrupt", "Interrupt");
}
@Override
protected void onServiceConnected() {
AccessibilityServiceInfo info = getServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_WINDOWS_CHANGED | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
info.flags = AccessibilityServiceInfo.DEFAULT;
info.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
info.flags = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
info.flags = AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
info.flags = AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
// We are keeping the timeout to 0 as we don’t need any delay or to pause our accessibility events
info.feedbackType = AccessibilityEvent.TYPES_ALL_MASK;
info.notificationTimeout = 100;
this.setServiceInfo(info);
// Toast.makeText(getApplicationContext(), "onServiceConnected", Toast.LENGTH_SHORT).show();
}
private static void logd(String msg) {
Log.d(TAG, msg);
}
private static void logw(String msg) {
Log.w(TAG, msg);
}
private static void logi(String msg) {
Log.i(TAG, msg);
}
}
你真的不应该强行停止应用程序。您应该让操作系统生命周期完成。在'startActivity'后尝试'finish()' –