# Основные операции с приложениями

Интерфейсы, связанные с операциями над приложениями, позволяют вам удобно запускать и закрывать приложения, предоставлять или отзывать разрешения, отключать или включать приложения, а также воспроизводить **любые** системные Activity, включая любые неэкспортированные Activity.

## Список установленных приложений

Получить package ID всех установленных приложений на устройстве.

```python
d.enumerate_all_pkg_names()
```

```python
>>> d.enumerate_all_pkg_names()
['com.android.calendar', 'com.android.camera2', 'com.android.contacts', 'com.android.deskclock', 'com.android.dialer', 'com.android.gallery3d', 'com.android.messaging', 'com.android.settings', 'com.android.vending', 'com.android.documentsui', 'com.android.quicksearchbox', 'com.google.android.googlequicksearchbox']
```

## Список запущенных приложений

Получить информацию о приложениях, запущенных в данный момент в системе.

```python
d.enumerate_running_processes()
```

```python
>>> d.enumerate_running_processes()
[packages: "com.android.launcher3"
processName: "com.android.launcher3"
uid: 10101
pid: 2333
, packages: "com.google.android.gms"
processName: "com.google.android.gms.persistent"
uid: 10075
pid: 2702
...
```

```python
>>> result = d.enumerate_running_processes()
>>> print (result[0].processName)
com.android.launcher3
```

## Получить приложение по имени

Использовать общее имя приложения для получения экземпляра приложения (когда Package ID неизвестен).

```python
# Добавлено в версии 7.75
app = d.get_application_by_name("微信")
```

## Получить приложение по имени пакета

Использовать Package ID приложения для получения экземпляра приложения.

```python
app = d.application("com.tencent.mm")
```

## Получить приложение на переднем плане

Получить экземпляр приложения, которое в данный момент работает на переднем плане.

```python
app = d.current_application()
```

## Получить клонированное приложение

Получить экземпляр клонированного приложения (обычно клонированные приложения различаются по `user`, и их UID равен 999).

```python
app = d.application("com.my.app", user=999)
```

## Запуск приложения

Вы можете вызвать этот интерфейс для запуска приложения.

```python
app.start()
```

## Остановка приложения

Вы можете вызвать этот интерфейс для принудительной остановки приложения.

```python
app.stop()
```

## Проверка работы на переднем плане

Вы можете вызвать этот интерфейс, чтобы проверить, работает ли приложение в данный момент на переднем плане.

```python
app.is_foreground()
```

## Получение информации о приложении

Вы можете вызвать этот интерфейс для получения информации о приложении, такой как версия и т.д.

```python
app.info()
```

```python
>>> app.info()
packageName: "com.android.settings"
uid: 1000
enabled: true
processName: "com.android.settings"
sourceDir: "/system/product/priv-app/Settings/Settings.apk"
dataDir: "/data/user_de/0/com.android.settings"
firstInstallTime: 1230739200000
lastUpdateTime: 1230768000000
versionCode: 1276
versionName: "10"
```

```python
>>> result = app.info()
>>> print (result.processName)
'com.android.settings'
```

## Проверка установки

Вы можете вызвать этот интерфейс, чтобы проверить, установлено ли приложение на устройстве.

```python
app.is_installed()
```

## Удаление приложения

Вы можете вызвать этот интерфейс для удаления приложения с устройства.

```python
app.uninstall()
```

## Получение последних Activity

Вы можете вызвать следующий интерфейс для получения последних 5 Activity в системе (максимум 12). Вы также можете напрямую воспроизвести любую из этих Activity.

```python
activities = d.get_last_activities(count=5)
```

```python
>>> d.get_last_activities(count=5)
[{'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}, {'action': 'android.intent.action.MAIN', 'category': 'android.intent.category.HOME', 'component': 'net.oneplus.launcher/.Launcher', 'extras': {'android.intent.extra.FROM_HOME_KEY': True}}]
```

## Запуск Activity приложения

Вы можете воспроизводить системные Activity и запускать любые Activity любого приложения. Доступные параметры перечислены ниже. Обратите внимание, что дополнительные данные (`extras`) поддерживают только типы `boolean`, `int`, `short`, `long`, `double`, `float` и `string`.
Определение параметра `flags` см. в документации [developer.android.com/reference/android/content/Intent](https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_BROUGHT_TO_FRONT).

```python
from lamda.const import *
d.start_activity(action="*", category="*", component="*", extras={"boolean": False, "int": 1, "string": "abc", "float": 1.123}, flags=FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK, data="*", debug=False)
```

Теперь, в качестве примера, возьмем результат вызова интерфейса `Получение последних Activity`. Вы можете напрямую воспроизвести последнюю системную Activity с помощью следующего кода.

```python
activity = d.get_last_activities(count=5)[-1]
d.start_activity(**activity)
```

Если вы хотите запустить Activity в клонированном приложении, следующий код воспроизведет Activity в нем.

```python
d.start_activity(**activity, user=999)
```

Ниже приведены некоторые примеры для справки. Следующий вызов совершит звонок в службу поддержки по номеру 10000.

```python
d.start_activity(action="android.intent.action.CALL", data="tel:10000")
```

Следующий вызов запустит приложение "Настройки" (Settings), что практически эквивалентно прямому запуску приложения.

```python
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings")
```

Следующий вызов откроет приложение "Настройки" в режиме отладки. Если вы когда-либо видели сообщение `Waiting for debugger`, это может быть вам полезно. Разумеется, ваше устройство или приложение должны быть отлаживаемыми. Отличие от предыдущего вызова заключается лишь в добавлении параметра `debug`.

```python
d.start_activity(action="android.intent.action.MAIN", category="android.intent.category.LAUNCHER", component="com.android.settings/.Settings", debug=True)
```

Следующий вызов напрямую перенаправит вас на страницу настроек сертификатов.

```python
d.start_activity(action="com.android.settings.TRUSTED_CREDENTIALS")
```


## Список разрешений приложения

Этот интерфейс может вывести список всех разрешений, объявленных приложением.

```python
app.permissions()
```

```python
>>> app.permissions( )
['android.permission.REQUEST_NETWORK_SCORES', 'android.permission.WRITE_MEDIA_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE', 'android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_SETTINGS', 'android.permission.WRITE_SECURE_SETTINGS', 'android.permission.DEVICE_POWER', 'android.permission.CHANGE_CONFIGURATION', 'android.permission.MOUNT_UNMOUNT_FILESYSTEMS', 'android.permission.VIBRATE', 'android.permission.BLUETOOTH', 'android.permission.BLUETOOTH_ADMIN', 'android.permission.BLUETOOTH_PRIVILEGED', 'android.permission.ACCESS_COARSE_LOCATION', 'android.permission.NFC', 'android.permission.HARDWARE_TEST', 'android.permission.CALL_PHONE', 'android.permission.MODIFY_AUDIO_SETTINGS', 'android.permission.MASTER_CLEAR', 'com.google.android.googleapps.permission.GOOGLE_AUTH', 'android.permission.ACCESS_DOWNLOAD_MANAGER', 'android.permission.READ_CONTACTS', 'android.permission.WRITE_CONTACTS', 'android.permission.ACCESS_NETWORK_STATE', 'android.permission.LOCAL_MAC_ADDRESS', 'android.permission.ACCESS_WIMAX_STATE', 'android.permission.CHANGE_WIMAX_STATE', 'android.permission.ACCESS_WIFI_STATE', 'com.android.certinstaller.INSTALL_AS_USER', 'android.permission.CHANGE_WIFI_STATE', 'android.permission.TETHER_PRIVILEGED', 'android.permission.FOREGROUND_SERVICE', 'android.permission.INTERNET', 'android.permission.CLEAR_APP_USER_DATA', 'android.permission.READ_PHONE_STATE', 'android.permission.MODIFY_PHONE_STATE', 'android.permission.ACCESS_FINE_LOCATION', 'android.permission.WRITE_APN_SETTINGS', 'android.permission.ACCESS_CHECKIN_PROPERTIES', 'android.permission.READ_USER_DICTIONARY', 'android.permission.WRITE_USER_DICTIONARY', 'android.permission.FORCE_STOP_PACKAGES', 'android.permission.PACKAGE_USAGE_STATS', 'android.permission.BATTERY_STATS', 'com.android.launcher.permission.READ_SETTINGS', 'com.android.launcher.permission.WRITE_SETTINGS', 'android.permission.MOVE_PACKAGE', 'android.permission.USE_CREDENTIALS', 'android.permission.BACKUP', 'android.permission.READ_SYNC_STATS', 'android.permission.READ_SYNC_SETTINGS', 'android.permission.WRITE_SYNC_SETTINGS', 'android.permission.READ_DEVICE_CONFIG', 'android.permission.STATUS_BAR', 'android.permission.MANAGE_USB', 'android.permission.MANAGE_DEBUGGING', 'android.permission.SET_POINTER_SPEED', 'android.permission.SET_KEYBOARD_LAYOUT', 'android.permission.INTERACT_ACROSS_USERS_FULL', 'android.permission.COPY_PROTECTED_DATA', 'android.permission.MANAGE_USERS', 'android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS', 'android.permission.READ_PROFILE', 'android.permission.CONFIGURE_WIFI_DISPLAY', 'android.permission.CONFIGURE_DISPLAY_COLOR_MODE', 'android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS', 'android.permission.SET_TIME', 'android.permission.ACCESS_NOTIFICATIONS', 'android.permission.REBOOT', 'android.permission.RECEIVE_BOOT_COMPLETED', 'android.permission.MANAGE_DEVICE_ADMINS', 'android.permission.READ_SEARCH_INDEXABLES', 'android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE', 'android.permission.OEM_UNLOCK_STATE', 'android.permission.MANAGE_USER_OEM_UNLOCK_STATE', 'android.permission.OVERRIDE_WIFI_CONFIG', 'android.permission.USE_FINGERPRINT', 'android.permission.MANAGE_FINGERPRINT', 'android.permission.USE_BIOMETRIC', 'android.permission.USE_BIOMETRIC_INTERNAL', 'android.permission.USER_ACTIVITY', 'android.permission.CHANGE_APP_IDLE_STATE', 'android.permission.PEERS_MAC_ADDRESS', 'android.permission.MANAGE_NOTIFICATIONS', 'android.permission.DELETE_PACKAGES', 'android.permission.REQUEST_DELETE_PACKAGES', 'android.permission.MANAGE_APP_OPS_RESTRICTIONS', 'android.permission.MANAGE_APP_OPS_MODES', 'android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS', 'android.permission.READ_PRINT_SERVICES', 'android.permission.NETWORK_SETTINGS', 'android.permission.TEST_BLACKLISTED_PASSWORD', 'android.permission.USE_RESERVED_DISK', 'android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS', 'android.permission.CAMERA', 'android.permission.MEDIA_CONTENT_CONTROL', 'com.wapi.permission.ACCESS_CERTIFICATE', 'com.oneplus.faceunlock.permission.FACE_SETTING', 'android.permission.STATUS_BAR_SERVICE', 'android.permission.MODIFY_AUDIO_ROUTING', 'com.oneplus.account.READ_ACCOUNT_INFO', 'com.android.settings.SEND_PERMISSION']
```

## Предоставление разрешений приложению

Этот интерфейс используется для предоставления приложению соответствующих системных разрешений. Вам следует использовать этот интерфейс для настройки разрешений, когда приложение не запущено. Использование его во время запроса разрешений работающим приложением не приведет к автоматическому нажатию кнопки "Разрешить".

```python
from lamda.const import *
app.grant(PERMISSION_READ_PHONE_STATE, mode=GrantType.GRANT_ALLOW)
```

Параметр `mode` метода `grant` также поддерживает `GrantType.GRANT_DENY`, что означает явный отказ в разрешении. Кроме того, поддерживается `GrantType.GRANT_IGNORE`, который имеет особое значение: он предоставляет приложению разрешение, но приложение фактически не может его использовать. Например, если приложение запрашивает доступ к камере, и вы используете этот параметр для отказа, камера приложения может показывать черный экран.

## Отзыв разрешений приложения

Вызов этого интерфейса может отозвать предоставленные приложению разрешения. Вам также следует вызывать его до запуска приложения.

```python
from lamda.const import *
app.revoke(PERMISSION_READ_PHONE_STATE)
```

## Проверка предоставления разрешения

Этот интерфейс используется для проверки, было ли определенное разрешение успешно предоставлено приложению.

```python
from lamda.const import *
app.is_permission_granted(PERMISSION_READ_PHONE_STATE)
```

## Очистка кэша приложения

Этот интерфейс используется для очистки кэшированных данных приложения, что обычно не влияет на его работу.

```python
app.clear_cache()
```

## Очистка данных приложения

Этот интерфейс используется для очистки данных приложения. Обратите внимание, что эта операция удалит все данные приложения, и информация, такая как данные учетной записи, будет утеряна.

```python
app.reset()
```

## Получение основной Activity

С помощью этого интерфейса вы можете запросить стартовую Activity (основную Activity) приложения.

```python
app.query_launch_activity()
```

```python
>>> app.query_launch_activity()
{'action': 'android.intent.action.MAIN', 'component': 'com.android.settings/com.android.settings.Settings', 'categories': ['android.intent.category.LAUNCHER']}
```

## Включение приложения

Этот интерфейс используется для включения отключенного приложения. После включения вы снова сможете им пользоваться.

```python
app.enable()
```

## Отключение приложения

Этот интерфейс используется для отключения приложения. Отключенное приложение не будет отображаться в списке приложений, и вы не сможете его использовать, пока оно не будет включено. Эта функция позволяет временно или полностью "заморозить" приложение. Такое приложение не сможет запускаться автоматически. Если на устройстве установлено много приложений, вы можете отключить временно неиспользуемые, чтобы сократить потребление системных ресурсов.

```python
app.disable()
```