Как закрыть специализированное приложение для Android с помощью API UiAutomator? Например, когда вы вручную нажимаете кнопку "Отправить" и проведите по экрану приложение, которое хотите закрыть.
Как закрыть приложение для Android с помощью UiAutomator?
Ответ 1
Лучшим вариантом будет использование getUiDevice.pressRecentApps, это загрузит последние приложения для вас, а затем сделайте скриншот, используя просмотрщик uiautomator, у вас есть вид xml загруженного экрана. Затем вы можете использовать этот xml для выбора объекта, который вы хотите провести, используя
UiObject app = new UIObject(new UiSelector().resourceId("The id of the app");
app.swipeLeft(100);
или справа
Это может закрыть ваше приложение. Xml будет зависеть от того, какой стиль используется для Android и устройства.
Ответ 2
Лучший способ (не устройство, версия ОС, пользовательский интерфейс или ориентация):
Runtime.getRuntime().exec(new String[] {"am", "force-stop", "pkg.name.of.your.app"});
Протестировано и работает над Nexus 5X с Android 6.0
Ответ 3
Основываясь на решении от @user597159, я получил следующее, чтобы закрыть все приложения в тестовой лаборатории Pixel 2 для Firebase (то есть тип устройства "walleye"):
private void killAllApps() throws Exception {
boolean keepSwiping = true;
int maxSwipeAttempts = 10;
uiDevice.pressRecentApps();
for (int swipeAttempt=0; swipeAttempt<maxSwipeAttempts && keepSwiping; swipeAttempt++) {
int height = uiDevice.getDisplayHeight();
int width = uiDevice.getDisplayWidth();
uiDevice.swipe(width / 2, height / 2, width, height / 2, 50);
UiObject clearAll1 = uiDevice.findObject(new UiSelector().text("Clear all"));
UiObject clearAll2 = uiDevice.findObject(new UiSelector().textStartsWith("Clear all"));
UiObject clearAll3 = uiDevice.findObject(new UiSelector().textContains("Clear all"));
UiObject clear = clearAll1.exists() ? clearAll1 :
(clearAll2.exists() ? clearAll2 : clearAll3);
if (clear.exists()) {
Logger.debug(TAG, "Attempting to close app by killAllApps and found clear=all button on swipeAttempt=" + swipeAttempt);
clear.click();
keepSwiping = false;
} else {
Logger.debug(TAG, "Attempting to close app by killAllApps but have to keep swiping swipeAttempt=" + swipeAttempt);
keepSwiping = true;
}
}
}
Обратите внимание, что на пикселе 2 написано "Очистить все", а не "Очистить все".
Я не мог заставить некоторые другие решения работать. Я получил UiObjectNotFoundException
за следующее:
app = uiDevice.findObject(new UiSelector().textContains("SDK Test App"));
А также для:
app = uiDevice.findObject(new UiSelector().className(com.locuslabs.android.sdk.SdkTestApplication.class));
Другими словами, app.exists()
возвратил false для этих подходов, которые пытались прокрутить приложение, чтобы закрыть на Pixel 2.
Ответ 4
Когда это будет только одно приложение, которое будет в списке последних приложений, это сработало для меня.
if(mDevice.pressRecentApps()) {
Thread.sleep(1000);
int startX = 300; int startY =835; int endX = 1000; int endY = 835; // co-ordinates refer to x-axis from left of screen to right.
int steps = 8;// speed at which the app closes
mDevice.swipe(startX,startY,endX,endY,steps);
}
Ответ 5
Вот как я убиваю все приложения для Android сразу с помощью uiautomator:
public static void killApps()
{
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
try
{
device.pressHome();
device.pressRecentApps();
// Clear all isn't always visible unless you scroll all apps down
int height = device.getDisplayHeight();
int width = device.getDisplayWidth();
device.swipe(width/2,height/2, width/2, height, 50);
UiObject clear = device.findObject(new UiSelector()
.resourceId("com.android.systemui:id/button")
.text("CLEAR ALL")
);
if (clear.exists())
{
clear.click();
}
}
catch (RemoteException e)
{
e.printStackTrace();
}
catch (UiObjectNotFoundException e)
{
e.printStackTrace();
}
}