强制停止android应用程序

问题描述:

enter image description here打开application details settings使用 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS),我该如何强制停止应用程序编程?强制停止android应用程序

+0

你真的不应该强行停止应用程序。您应该让操作系统生命周期完成。在'startActivity'后尝试'finish()' –

有两种方式,一个更粗鲁一个更好的

好做法

如果运行

this.finish();方法将只有一个活动足够

如果您有多个活动运行

您必须致电this.finishAffinity();方法。 这是在一般情况下,最好的做法,你可以同时拥有一个或多个活动

粗鲁的方式

System.Exit(0); 

我加入这个只为信息,但这可能不能与多个活动的工作这不是关闭应用程序的好方法。它大部分是“保持电源按钮,直到电脑关机”。

+0

感谢您的回复,但是我的要求是在打开App信息屏幕后强制关闭应用程序。 –

+0

@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" 
+0

Thnx的答复。是的,这是解决方案之一,但这只会在根植设备中起作用。 –

+0

噢,是的,这是一个主要的限制。 –

您可以使用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

+0

感谢您的回复,但给出的服务是用来打开应用程序的详细信息。打开屏幕后,我想以编程方式执行强制关闭操作。 –

+0

看起来像你做错了:D检查此:http://stackoverflow.com/questions/26628262/how-to-click-button-in-settings-using-accessibilityservice –

+0

如果你不能找到按钮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); 
} 

}