2016-12-27 159 views
0

enter image description here打開application details settings使用 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS),我該如何強制停止應用程序編程?強制停止android應用程序

+0

你真的不應該強行停止應用程序。您應該讓操作系統生命週期完成。在'startActivity'後嘗試'finish()' –

回答

0

有兩種方式,一個更粗魯一個更好的

好做法

如果運行

this.finish();方法將只有一個活動足夠

如果您有多個活動運行

您必須致電this.finishAffinity();方法。 這是在一般情況下,最好的做法,你可以同時擁有一個或多個活動

粗魯的方式

System.Exit(0); 

我加入這個只爲信息,但這可能不能與多個活動的工作這不是關閉應用程序的好方法。它大部分是「保持電源按鈕,直到電腦關機」。

+0

感謝您的回覆,但是我的要求是在打開App信息屏幕後強制關閉應用程序。 –

+0

@VishalChaudhari哦,你的意思是設置中的應用程序信息屏幕?我認爲應用程序內的應用程序信息屏幕對不起 –

0

在運行時單擊另一個應用程序的元素會被視爲安全威脅。你需要通過黑客才能通過這個障礙。

有一個我最近發現的黑客,你可以使用它。你可以找到源代碼在這裏: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

噢,是的,這是一個主要的限制。 –

1

您可以使用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(「強制停止」) –

0

我發現一個解決方案爲強制停止。強制停止後,我該如何返回到我的活動頁面?

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); 
} 

} 
相關問題