Приветствую Вас Гость | RSS

От ГИС к играм для PDA и далее...

Четверг, 10.07.2025, 19:49

НТФ СИ
НАУЧНО-ТЕХНИЧЕСКИЙ ФОНД СИСТЕМ ИНФОРМАЦИИ

КОМПЛЕКС 
ИГР НА БАЗЕ РАЗЛИЧНЫХ СЛОВАРЕЙ ДЛЯ ПЛАТФОРМЫ "АНДРОИД"
Комплекс разработан для в 2009г

Внутреннее устройство Android-приложения
Для разработки Android-приложений предоставляется четыре строительных блока, которые можно использовать в сочетании друг с другом. Информация о том, какие из этих блоков будут использованы в конкретном приложении, хранится в файле манифеста AndroidManifest.xml. Ниже эти блоки представлены в графическом виде.



Activity (Деятельность)

Деятельность представляет собой отдельный экран в приложении, реализованный в виде экземпляра класса, наследуемого от базового класса Activity. Деятельности позволяют отображать пользовательские элементы интерфейса на экране и обрабатывать возникающие события. В большинстве случаев приложение имеет несколько экранов, которые могут взаимодействовать между собой при помощи возвращаемых ими значений. Когда отображается новый экран, работа с предыдущим приостанавливается, и он помещается в стек деятельностей, называемый историей. Таким образом, пользователь может перемещаться по истории по принципу стека – "последний вошел, первый вышел”, то есть, поработав с текущим открытым экраном и закрыв его в последствии, автоматически открывается экран, который был последним помещен в историю. Также деятельности могут быть удалены из истории, если они больше не используются. Для перемещения между экранами используется специальный класс Intent (Намерение), который описывает, какие действия хочет выполнить приложение. Наиболее важными составными частями намерения являются действие и данные, над которыми это действие выполняется. Например, чтобы посмотреть контактную информацию конкретного человека, вам нужно создать намерение, действием для которого будет VIEW (Просмотр), а данными – идентификатор этого человека, называемый URI (Uniform Resource Identifier – унифицированный идентификатор ресурса). Как было сказано выше, Intent нужно для указания действий, которые хочет выполнить приложение. А для того, чтобы Activity знало, как реагировать на эти действия, используется класс IntentFilter (фильтр намерений). Например, чтобы на экран можно было вывести контактную информацию о человеке, нужно опубликовать IntentFilter, который сообщит экрану, как обрабатывать действием VIEW связанные с ним данные о человеке. Все деятельности публикуют свои фильтры намерений в файле манифеста. Таким образом, когда приложению нужно что-либо сделать, вы вызываете экран с нужным вам намерением (например, просмотр контактных данных). Т.е. ОС просматривает фильтры намерений всех приложений и отбирает тот экран, чьи фильтры намерений лучше всего соответствуют указанному вами намерению. Отобранное Activity сообщает вызвавшему её намерению о том, что оно запустилось. С этого момента намерение считается разрешенным (выполненным).

Broadcast Intent Receiver (Приёмник широковещательных намерений)

BroadcastReceiver используется, когда вы хотите, чтобы ваше приложение реагировало на внешние события, например, звонок телефона. Приёмники широковещательных намерений не имеют пользовательского интерфейса, но они могут использовать менеджер извещений, чтобы оповестить пользователя, когда что-либо произошло. Приёмники широковещательных намерений также регистрируются в файле манифеста, но есть возможность опубликовать их и непосредственно в коде программы с помощью метода registerReceiver абстрактного класса Context. Вам не нужно самому запускать программу, когда произошло какое-либо внешнее событие. Как только BroadcastReceiver прореагирует на возникшее событие, ОС сама запустит ваше приложение. Намерения, которые реализует ваша программа, также могут быть внешними событиями для остальных приложений, т.е. BroadcastReceiver аналогичным способом будет реагировать на ваши события, как и в случае с другими внешними событиями. Это реализуется методом sendBroadcast() того же класса Context.

Service (Служба)

Служба это - компонент приложения, который позволяет работать ему в фоновом режиме без использования интерфейса пользователя, например фоновое проигрывание музыки. Служба будет работать, пока вы ее не остановите. Таким образом, вы можете слушать музыку и работать с другими приложениями одновременно. Также вы можете управлять службой (например, поставить на паузу или остановить проигрывание музыки) при помощи метода bindService класса Context.

Content Provider (Контент-провайдер)

Программы могут хранить свои данные в файлах, базах данных SQLite и т.п. Контент-провайдеры служат удобным механизмом, посредством которого данные ваших приложений могут совместно использоваться другими приложениями. Класс ContentProvider реализует множество методов для работы с данными (сохранение, поиск и т.п.).

В большинстве случаев каждое Android-приложение запускается в своем собственном Linux-процессе. Процесс создается, когда приложению требуются выполнить какой-либо код, и остается запущенным, пока приложение используется. По завершению процесса система освобождает свою память для использованию другими программами.

Важной особенностью Android-приложений является то, что время жизни процесса не контролируется напрямую самой программой. Это контролирует система путем определения влияния различных компонент текущего приложения на корректное выполнение других запущенных программ, а также влияния выполняемого приложения на общее количество памяти в системе.

При использовании различных компонентов приложения (Activity, Service, BroadcastReceiver) очень сложно воздействовать на время жизни процесса этого приложения. Если использовать эти компоненты не правильно, это может привести к уничтожению процесса, выполняющего какие-либо важные функции.

Android определяет, какие процессы должны быть уничтожены по причине малого объема оставшейся памяти, на основе так называемой иерархии важности, в которую помещаются те процессы, компоненты которых наименее важны для работоспособности других запущенных приложений и всей системы в целом. Ниже приведен список типов процессов в порядке их значимости:

1. Активный процесс имеет наивысший приоритет важности. Он владеет деятельностью, которая активна в данный момент (был вызван метод onResume()), или текущим исполняемым приёмником широковещательных намерений (был вызван метод onReceive()). Завершение данного типа процесса практически исключено, это возможно только в случае очень маленького объема памяти в системе.

2. Видимый процесс владеет деятельностью, видимой для пользователя, но не активной в данный момент (был вызван метод onPause()). Это особенно заметно, если активная деятельность отображается в виде диалога, что позволяет видеть другие деятельности, находящиеся за ней. Такой тип процесса очень важен и не будет уничтожен, если он требуется для работы активного процесса.

3. Процесс службы владеет службой, которая была запущена методом startService(). Несмотря на то, что эти службы не видны пользователю (фоновое проигрывание музыки или скачивание файлов из сети), они всегда будут выполняться до тех пор, пока не будет достаточно памяти для активных и видимых процессов.

4. Фоновый процесс владеет деятельностью, которая не видна в данный момент для пользователя (был вызван метод onStop()). Этот тип процесса не взаимодействует напрямую с пользователем. Система может уничтожить такой процесс в любой момент и освободить память для трех вышеприведенных типов процессов. Если в системе выполняются множество таких фоновых процессов, система помещает их в список LRU (Least Recently Used, неиспользовавшихся дольше всех). При малом количестве памяти уничтожен будет последний процесс из этого списка.

5. Пустой процесс не имеет активных компонентов приложения. Ролью этого процесса является кэширование, при использование которого приложение будет запускаться быстрей в следующий раз, когда потребуется использование каких-либо компонент. Такие образом, такие процессы уничтожаются довольно часто, чтобы сохранялся общий баланс между этими пустыми кэшами и основным кэшем ядра. Каждый из строительных блоков по-разному влияет на жизненный цикл приложения.


 
Контакты: НТФ СИ