Главная » Программирование игр под Android » Программный запуск активностей – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

Класс ListActivity содержит защищенный метод onListltemClickO, вызываемый при нажатии элемента списка. Нам нужно переопределить этот метод в нашем классе AndroidBasicsStarter. Именно это мы и делали в листинге 4.1.

Аргументами этого метода являются объект ListView (который ListActivity использует для отображения элементов), View (содержащийся в Li stView элемент, на который производится касание), position (позиция нажатого элемента в списке) и i d, который нас не слишком интересует. На самом деле главное для нас – это аргумент position.

MeTOfl.onLi stltemCl i cked довольно законопослушен и первым делом вызывает метод базового класса. При переопределении методов активности это всегда является хорошей практикой. Далее мы получаем имя класса из массива tests, основываясь на аргументе position. Это первый элемент головоломки.

Ранее мы говорили о том, что можем запускать активности, определенные в файле манифеста, программно посредством Intent. Класс Intent обладает простым и удобным конструктором, принимающий два аргумента: экземпляр Context и экземпляр Class, представляющий Java-класс активности, которую мы хотим запустить. Context – это интерфейс, предлагающий нам общую информацию о нашем приложении. Он реализуется классом Activity, поэтому мы просто передаем конструктору Intent ссылку this.

Чтобы получить экземпляр Class, представляющий запускаемую нами активность, мы используем небольшое отражение, с которым знакомы те, кто работал с Java. Статический метод Class. forName принимает строку, содержащую полное имя класса, чей экземпляр мы хотим получить. Все тестовые активности (которые мы реализуем позже) содержатся в пакете com. badl ogi с. androi dgames. Соединяя имя пакета с названием класса, полученного из массива tests, мы получаем полное имя класса запускаемой активности, которое передаем методу CI ass. forName, и получаем таким образом хороший экземпляр CI ass, который можно передать конструктору Intent.

После создания экземпляра Intent мы можем вызывать метод startActivity, определенный в интерфейсе Context. Поскольку наша активность реализует этот интерфейс, мы просто вызываем эту реализацию. Вот и все.

Как же будет вести себя наше приложение? Сначала будет показана стартовая активность. Каждый раз, когда мы нажимаем элемент списка, запускается соответствующая активность. При этом основная активность переходит в паузу и уходит на задний план. Новая активность будет создана намерением, которые мы послали, и заменит стартовую на экране. При нажатии кнопки Назад на телефоне активность будет уничтожена, на экране восстановится стартовая активность.

 

Создание тестовых активностей

При создании новой тестовой активности нам необходимо выполнить следующие шаги.

1. Создать соответствующий класс Java в пакете и реализовать его логику.

2. Добавить запись о нем в файл манифеста, используя все необходимые атрибуты (например, android: conf igChanges или android: screenOri entati on). Обратите внимание – мы не определяем элемент <i ntent-f i lter>, поскольку запускаем активность программно.

3. Добавить имя класса активности в массив tests класса Androi dBasicsStarter.

После осуществления этих шагов обо все остальном будет заботиться логика, реализованная нами в классе AndroidBasicsStarter. Новая активность автоматически появится в списке и запустится при нажатии ее названия.

Вопрос, который вас может заинтересовать, – запускается ли каждая тестовая активность в отдельном процессе и с собственной виртуальной машиной? Ответ – нет. Приложение, состоящее из активностей, обладает так называемым стеком активностей. При каждом запуске новой активности она помещается в этот стек. При ее закрытии последняя активность, помещенная в стек, появляется на экране, становясь новой действующей активностью.

Данный механизм имеет свои сложности. Во-первых, все активности приложения (содержащиеся в стеке на паузе и активная на экране) делят одну виртуальную машину, во-вторых – помещаются в одной области памяти. Это может быть как положительным, так и отрицательным моментом. Если активность содержит статические поля, они получат свою область памяти при ее запуске. При этом, будучи статическими, они переживут уничтожение самой активности и последующую сборку мусора. Как вы понимаете, при неосторожном обращении со статическими полями может произойти утечка памяти. Подумайте дважды, прежде чем использовать статические Поля.

Однако, как я уже неоднократно замечал, в наших играх мы будем использовать только одну активность. Стартовая активность, созданная нами выше, – исключение из правила, которое делает нашу жизнь легче. Но не беспокойтесь, у нас будет достаточно возможностей нарваться на неприятности даже с одной активностью.

ПРИМЕЧАНИЕ

Все зависит от глубины погружения в программирование пользовательских интерфейсов для Android. Мы всегда будем использовать один объект View в активности для вывода и получения ввода. Если вы хотите изучить такие возможности, как компоновка, группировка представлений, а также другие свистелки-звенелки, предлагаемые библиотекой Android UI, могу предложить вам изучить отличное руководство пользователя на сайте Android Developers.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии