Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Введение в разработку Android-приложений



Введение в разработку Android-приложений

A

|

версия для печати

Лекция 1: 12 3 4 || Самостоятельная работа 1 >

Компоненты Android-приложения

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

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

В Android существует четыре типа компонентов: Activities, Services, Broadcast receivers и Content providers.

Также важно отметить объекты Intents, в Android-приложениях почти все работает благодаря им. Intent – это механизм для описания одной операции (выбрать фотографию, отправить письмо, сделать звонок, запустить браузер и перейти по указанному адресу и другие). Наиболее распространенный сценарий использования Intent – запуск другого Activity в своем приложении.

Activities

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

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

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

Activity может находиться в одном из трех состояний:

· Active или Running – находится на переднем плане и имеет фокус для взаимодействия с пользователем.

· Paused – потеряло фокус, но все еще видно пользователю. Сверху находится другое Activity, которое или прозрачно или закрывает не весь экран. Приостановленное Activity полностью " живое" (его состояние сохранено), но может быть уничтожено системой в случае нехватки памяти.

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

Если Activity приостановлено или остановлено, система может удалить его из памяти, либо послать запрос на его завершение, или просто уничтожить его процесс. Когда Activity снова отображается пользователю, его состояние полностью восстанавливается.

Переходя от состояния к состоянию, Activity уведомляет об этом, вызывая следующие методы:

· void onCreate()

· void onStart()

· void onRestart()

· void onResume()

· void onPause()

· void onStop()

· void onDestroy()

Жизненный цикл Activity состоит из трех вложенных циклов (Рис. 1.3):

· Жизненный цикл activity начинается с вызова метода onCreate(), в котором производится первоначальная настройка глобального состояния, и завершается вызовом метода onDestroy(), в котором оно освобождает занятые ресурсы.

· Видимая часть жизненного цикла происходит между вызовами onStart() и onStop(). В течение этого времени пользователь может видеть Activity на экране, хотя оно может быть не на переднем плане и не взаимодействовать с пользователем. Методы onStart() и onStop() могут вызываться столько раз, сколько Activity становится видимым или скрытым для пользователя.

· На переднем плане Activity находится между вызовами onResume() и onPause(). В течение этого времени Activityнаходится поверх других и взаимодействует с пользователем. Activity может часто переходить в состояние паузы и выходить из него. Например, метод onPause() может быть вызван, когда устройство переходит в спящий режим или когда запускается другое Activity, а метод onResume() – при получении результата от закрывающегося Activity.


Рис. 1.3. Жизненный цикл Activity

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

Метод Описание Может ли быть уничтожен? Следующий метод
onCreate() Вызывается один раз, при создании Activity. Здесь должна производиться первоначальная настройка – создание экземпляров класса View (пользовательский интерфейс), запись данных в списки и так далее. За ним всегда следует вызов метода onStart(). нет onStart()
onStart() Вызывается после того как Activity было остановлено и теперь снова запускается. За ним всегда следует вызов onResume() нет onResume()
onRestart() Вызывается перед тем как Activity становится видимым для пользователя. За ним следует вызов onResume(), если Activity переходит на передний план, или onStop(), если оно скрывается. нет onResume() или onStop()
onResume() Вызывается перед тем, как Activity начинает взаимодействовать с пользователем. С этого момента Activity находится на вершине стека и принимает весь пользовательский ввод. За ним следует вызов onPause(). нет onPause()
onPause() Вызывается системой перед возобновлением другого Activity. Этот метод обычно используется для сохранения измененных данных, остановки анимации и других вещей, которые могут потреблять процессорное время. Другое Activity не будет возобновлено, пока он не завершится. За ним может быть вызван метод onResume() если Activity возвращается на передний план, или метод onStop(), если оно становится невидимым для пользователя. да onResume() или onStop()
onStop() Вызывается когда Activity больше не видно пользователю. Это может происходить потому, что оно уничтожается или потому, что другое Activity было возобновлено и перекрыло его. Затем может быть вызван либо метод onRestart(), если Activity возвращается для взаимодействия с пользователем, либо метод onDestroy(), если оно завершается. да onRestart() или onDestroy()
onDestroy() Вызывается перед уничтожением Activity. Это последний вызов, который оно получит. Может быть вызван либо потому, что Activity завершается (кто-то вызвал метод finish()), либо потому, что система временно уничтожает этот экземпляр для экономии памяти. да нет

Обратите внимание на колонку " Может ли быть уничтожен? ". Она указывает на то, может ли система уничтожить процесс, в котором запущено Activity, в любой момент после возврата из этого метода, не выполняя больше ни одной строчки кода Activity. Три метода: OnPause(), OnStop() и OnDestroy() – отмечены " Да". Но только метод OnPause() будет гарантированно вызван перед уничтожением процесса, поскольку он первый в этом списке, а OnStop() и OnDestroy() могут не вызываться. Поэтому для сохранения измененных данных нужно использовать метод OnPause(). Методы, отмеченные " Нет", защищают процесс, в котором запущено Activity, от уничтожения с момента их вызова.

Services

Service – это некий процесс, который запускается в фоновом режиме. Как пример, Service может получать данные по сети, выполнять какие-либо длительные вычисления. Хорошим примером Service служит проигрыватель музыки. Пользователь может выбрать любую песню в проигрывателе, включить ее и закрыть плеер занявшись чем-нибудь другим. Музыка будет проигрываться в фоновом процессе. Service проигрывания музыки будет работать, даже если Activity плеера закрыта.

Подобно Activity, Service имеет свои методы жизненного цикла:

· void onCreate()

· void onStart(Intent intent)

· void onDestroy()

В полном жизненном цикле Service существует два вложенных цикла:

· полная целая жизнь Service – промежуток между временем вызова метода onCreate() и временем возвращения onDestroy(). Подобно Activity, для Services производят начальную инициализацию в onCreate() и освобождают все остающиеся ресурсы в onDestroy();

· активная целая жизнь Service – начинается с вызова метода onStart(). Этому методу передается объект Intent, который передавался в startService().

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

Broadcast receivers

Broadcast receiver– это компонент, который ничего не делает, кроме того, что рассылает и реагирует на широковещательные сообщения. Примером широковещательных компонентов могут быть: сообщения об переходе на летнее/зимнее время, сообщения об минимальном заряде батареи и так далее.

Broadcast receiver не отображает пользовательский интерфейс, но может запустить Activity на полученное сообщение или использовать NotificationManager для привлечения внимания пользователя. Привлечь внимание пользователя можно, например, вибрацией устройства, проигрыванием звука или миганием вспышки.

Приемник широковещательных сообщений имеет единственный метод жизненного цикла: onReceive(). Когда широковещательное сообщение прибывает для получателя, Android вызывает его методом onReceive() и передает в него объект Intent, содержащий сообщение. Приемник широковещательных сообщений является активным только во время выполнения этого метода. Процесс, который в настоящее время выполняет Broadcast receiver, является приоритетным процессом и будет сохранен, кроме случаев критического недостатка памяти в системе.

Когда программа возвращается из onReceive(), приемник становится неактивным и система полагает, что работа объекта Broadcast receiver закончена. Процесс с активным широковещательным получателем защищен от уничтожения системой. Однако процесс, содержащий неактивные компоненты, может быть уничтожен системой в любое время, когда память, которую он потребляет, будет необходима другим процессам.

Content providers

Content providers предоставляют доступ к данным (чтение, добавление, обновление). Content provider может предоставлять доступ к данным не только своему приложению, но и другим. Данные могут размещаться в файловой системе, в базе данных.

 

Дальше > >

 

 

Виджеты

Виджет – это объект View, который служит интерфейсом для взаимодействия с пользователем. Иначе, виджеты – это обычные элементы управления: кнопки, текстовые поля, флажки, переключатели, списки.

Стандартные элементы имеют привычные свойства: ширина, высота, цвет и тому подобные. Еще два важных свойства, которые могут влиять на размер и положение дочерних элементов - важность (weight) и выравнивание (gravity). Weight используется для присвоения элементу показателя важности, отличающего его от других элементов, находящихся в контейнере. Предположим, в контейнере находится три элемента управления: первый имеет важность 1 (максимальное возможное значение), а два других имеют значение 0. В этом случае элемент управления, который имеет значение важности 1, займет в контейнере все свободное пространство. Gravity – это ориентация в контейнере. Например, необходимо выровнять текст надписи по правому краю, тогда свойство gravity будет иметь значение right. Набор значений для gravity ограничен: left, center, right, top, bottom, center_vertiсаl, сliр_horizontal и еще некоторые.

TextView

Виджет TextView предназначен для отображения текста без возможности редактирования его пользователем. TextView один из самых используемых виджетов. С его помощью пользователю удобнее ориентироваться в программе. По сути, TextView служит для представления пользователю описательного текста.

Атрибуты TextView:

· android: textsize – размер текста. При установке размера текста используются несколько единиц измерения: px (pixels), dp (density-independent pixels), sp (scale-independent pixels), in (inches), pt (points), mm (millimeters). Чтобы текст мог меняться в зависимости от выбора пользователя, используют единицы измерения sp.

· android: textstyle – стиль текста. Используются константы: normal, bold, italic.

· android: textcolor – цвет текста. Используются четыре формата в шестнадцатеричной кодировке: #RGB; #ARGB; #RRGGBB; #AARRGGBB, где R, G, B – соответствующий цвет, А – прозрачность (alpha-channel). Значение А, установленное в 0, означает прозрачность 100%.

Чтобы оживить текст, можно дополнительно задействовать атрибуты для создания эффектов тени: shadowColor (цвет тени), shadowDx (смещение тени по горизонтали), shadowDy (смещение по вертикали) и shadowRadius (ширина тени). Во время установки значений изменения не видны, необходимо запустить пример в эмуляторе или на устройстве.

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

< color name=" tvBackground" > #337700< /color>

Следующий код будет ошибочным:

tv.setBackgroundColor(R.color.tvBackground);

Нужно так (два варианта):

tv.setBackgroundResource(R.color.tvBackground);

tv.setBackgroundColor(getResources().getColor(R.color.tvBackground));

Button

Кнопка – один из самых распространенных элементов управления в программировании. Наследуется от Textview и является базовым классом для класса СompoundButton. От класса CompoundButton, в свою очередь, наследуются такие элементы как CheckBox, ToggleButton и RadioButton. На кнопке располагается текст и на кнопку нужно нажать, чтобы получить результат.

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

Иногда нужно сделать кнопку недоступной. Через XML нельзя сделать кнопку недоступной (нет подходящего атрибута). Это можно сделать программно через метод setEnable(). Как альтернативу можно рассмотреть атрибут android: clickable, который позволит кнопке не реагировать на касания, но при этом вид кнопки останется обычным.

Другие типы виджетов

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

· RadioButton. Главная особенность элемента RadioButton состоит в том, что он не используется в одиночестве. Всегда должно быть два и более переключателя и только один из них может быть выбранным.

· ToggleButton по своей функциональности похож на флажок (checkbox) или переключатель (radiobutton). Это кнопка, которая может находиться в одном из двух состояний: активна (On) или неактивна (Off).

· Switch – еще один вид переключателей, представляет собой полоску с двумя состояниями, переключиться между которыми можно сдвиганием ползунка.

· Spinner похож на выпадающий список. В закрытом состоянии элемент показывает одну строчку, при раскрытии выводит список в виде диалогового окна с переключателями.

· ProgressBar (индикатор прогресса) применяется в тех случаях, когда пользователю нужно показать, что программа не зависла, а выполняет продолжительную работу.

· SeekBar – обычный слайдер, чтобы пользователь мог передвигать ползунок пальцем на экране. Также можно передвигать ползунок с помощью клавиш-стрелок.

· RatingBar показывает значение рейтинга в виде звездочек. Можно установить рейтинг касанием пальца или с помощью клавиш курсора, используя заранее заданное количество звездочек.

Для виджета RatingBar используются следующие методы:

· setNumStart(int) – устанавливает число звездочек

· getRating() – возвращает значение рейтинга

· setRating(float) – устанавливает значение рейтинга

· setStepSize(float) – устанавливает шаг приращения рейтинга

Адаптеры

В Android часто используются адаптеры. Если говорить в общих чертах, то адаптеры упрощают связывание данных с элементом управления. Адаптеры используются при работе с виджетами: ListView, Spinner и другими.

ListAdapter наследует базовый класс Adapter и служит мостом между данными и ListView. Часто данные могут быть представлены курсорами, но необязательно. Удобство в том, что ListView может отображать любые данные, лишь бы они были завернуты в ListAdapter. ListAdapter имеет несколько подклассов (ArrayAdapter, BaseAdapter, CursorAdapter и другие), которые предназначены для различных целей.

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

· BaseAdapter – очень простой адаптер, обычно используется для заполнения списка статическими данными (которые могут быть взяты из ресурсов).

· CursorAdapter предоставляет данные для списка через курсор.

Эмулятор.

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

Эмулятор создается при помощи Android Virtual Device Manager (AVD Manager). Создавая новое виртуальное устройство, в окне свойств можно задать произвольное название для эмулятора, указать версию API и установить остальные параметры (например, разрешение, плотность пикселей на экране, емкость SD-карты и другие).

С помощью эмулятора можно иметь полноценный доступ к интернету, настраивать скорость и латентность соединения. Также можно имитировать входящие и исходящие телефонные звонки и SMS-сообщения. Но в то же время эмулятор не поддерживает виброзвонок, светодиоды, камеру, акселерометр и работу с компасом.

Теперь, когда известны основные принципы программирования для Android и создан эмулятор, можно приступать к написанию приложений.

 

Дальше > >

 

 

Самостоятельная работа 1:

Цель лабораторной работы

· Познакомиться с инструментами разработки Android-приложений.

· На примере простейших программ разобрать структуру типичного Android-приложения.

· Научиться запускать приложение на эмуляторе.

· Научиться тестировать приложение с помощью Dalvik Debug Monitor Server (DDMS).

План лабораторной работы

· Создать эмулятор x86.

· Разобрать следующие приложения, запустить их на эмуляторе и выполнить для каждого примера дополнительное задание:

1. Hello, World!

2. Работа с кнопками

3. Работа с анимацией

4. Работа с GPS

Работа с кнопками

На экране расположены три кнопки (Red, Green, Blue), при нажатии на которые меняется фоновый цвет и появляется соответствующее уведомление (Рис 2.3).


Рис. 2.3. Запущенное на эмуляторе приложение Button Example

· Импортируйте в рабочую область проект Button Example.

· Запустите его на эмуляторе и протестируйте.

· Ознакомьтесь с примером создания кнопки (res/layout/activity_main.xml) и обработки ее нажатия (src/MainActivity.java).

· Дополните приложение еще одной кнопкой, при нажатии на которую в качестве фона устанавливалось бы какое-нибудь изображение (изображение скопируйте в директорию res/drawable).

Работа с анимацией

На экране расположены три кнопки (Frame animation, Transform animation, Cancel animation). При нажатии на первую кнопку воспроизводится покадровая анимация, при нажатии на вторую – анимация преобразований, при нажатии на третью анимация прекращается.

· Импортируйте в рабочую область проект Animaton Example.

· Запустите его на эмуляторе и протестируйте.

· Ознакомьтесь с примерами создания покадровой анимации и анимации преобразований (res/anim/frame_anim.xml и res/anim/transform_anim.xml) и примерами их применения к объекту (src/MainActivity.java).

· Дополните приложение реализацией своих примеров с анимацией. Описание возможных элементов анимации преобразований представлено в таблице:

Элемент Атрибуты
< alpha> анимация изменения прозрачности fromAlpha – начальное значение прозрачности toAlpha – конечное значение прозрачности
< scale> анимация изменения размера fromxScale – начальный масштаб по X toxScale – конечный масштаб по X fromYScale – начальный масштаб по Y toYScale – конечный масштаб по Y pivotX – Х-координата закрепленного центра pivotY – Y-координата закрепленного центра
< translate> анимация движения (вертикальная/горизонтальная) fromXDelta – начальное положение по X toXDelta – конечное положение по X fromYDelta – начальное положение по Y toYDelta – конечное положение по Y
< rotate> анимация вращения fromDegrees – начальный угол вращения toDegrees – конечный угол вращения pivotX – координата X центра вращения pivotY – координата Y центра вращения

 

Дальше > >

 

 

Самостоятельная работа 1:

Работа с GPS

На экране представлена следующая информация о местоположении (Рис 2.4):


Рис. 2.4. Запущенное на эмуляторе приложение Location Example

· Статус (уведомление о том, когда были получены данные)

· Широта

· Долгота

· Импортируйте в рабочую область проект Location Example.

· Запустите его на эмуляторе. На экране появится уведомление " Waiting for location".

· Теперь виртуальному устройству необходимо передать информацию о местоположении. Для этого, не закрывая окно эмулятора, запустите DDMS ( Window -> Open Perspective -> Other -> DDMS ) и через вкладку Emulator Control отправьте устройству необходимые данные (Рис 2.5).


Рис. 2.5. Значения долготы и широты отправляются на эмулятор с помощью DDMS

· Убедитесь, что программа работает корректно, и эмулятор вывел полученную информацию о местоположении.

· Обратите внимание на тег < uses-permission> в файле AndroidManifest.xml и подумайте, зачем он прописывается в данном приложении.

· Откройте файл src/MainActivity.java и постарайтесь разобраться, как происходит жизненный цикл Activity данного приложения, и какие действия совершаются на каждом этапе.

Приложение к лабораторной работе

Данное приложение содержит тексты программ, рассматриваемых в примерах.

1. Button Example

o res/layout/activity_main.xml

o < manifest xmlns: android=" http: //schemas.android.com/apk/res/android"

o package=" com.example.application"

o android: versionCode=" 1"

o android: versionName=" 1.0" >

o

o < uses-sdk

o android: minSdkVersion=" 8"

o android: targetSdkVersion=" 15" />

o

o < application

o android: icon=" @drawable/ic_launcher"

o android: label=" @string/app_name" >

o < activity

o android: name=".MainActivity"

o android: label=" @string/title_activity_main" >

o < intent-filter>

o < action android: name=" android.intent.action.MAIN" />

o

o < category android: name=" android.intent.category.LAUNCHER" />

o < /intent-filter>

o < /activity>

o < /application>

o

o < /manifest>

o src/MainActivity.java

o

o package com.example.application;

o

o import android.app.Activity;

o import android.graphics.Color;

o import android.os.Bundle;

o import android.view.View;

o import android.view.View.OnClickListener;

o import android.widget.Button;

o import android.widget.LinearLayout;

o import android.widget.Toast;

o

o public class MainActivity extends Activity implements OnClickListener {

o

o private Button switchToGreen;

o private Button switchToRed;

o private Button switchToBlue;

o private LinearLayout screenLayout;

o private Toast informationToast;

o

o @Override

o public void onCreate(Bundle savedInstanceState) {

o super.onCreate(savedInstanceState);

o setContentView(R.layout.activity_main);

o

o // init buttons

o switchToBlue = (Button) findViewById(R.id.switchBlue);

o switchToGreen = (Button) findViewById(R.id.switchGreen);

o switchToRed = (Button) findViewById(R.id.switchRed);

o screenLayout = (LinearLayout) findViewById(R.id.screenLayout);

o

o // setup listeners

o switchToBlue.setOnClickListener(this);

o switchToRed.setOnClickListener(this);

o switchToGreen.setOnClickListener(this);

o

o informationToast = Toast.makeText(this, " ", Toast.LENGTH_SHORT);

o }

o

o public void onClick(View view) {

o if (switchToBlue.equals(view)) {

o screenLayout.setBackgroundColor(Color.BLUE);

o showToast(" Hello blue" );

o } else if (switchToRed.equals(view)) {

o screenLayout.setBackgroundColor(Color.RED);

o showToast(" Hello red" );

o } else if (switchToGreen.equals(view)) {

o screenLayout.setBackgroundColor(Color.GREEN);

o showToast(" Hello green" );

o }

o

o }

o

o private void showToast(String text) {

o informationToast.cancel();

o informationToast.setText(text);

o informationToast.show();

o }

o }

2. Animation Example

o res/anim/frame_anim.xml

o <? xml version=" 1.0" encoding=" utf-8"? >

o < animation-list xmlns: android=" http: //schemas.android.com/apk/res/android"

o android: oneshot=" false" >

o

o < item

o android: drawable=" @drawable/ic_launcher"

o android: duration=" 200" />

o < item

o android: drawable=" @drawable/ic_launcher1"

o android: duration=" 200" />

o < item

o android: drawable=" @drawable/ic_launcher2"

o android: duration=" 200" />

o < item

o android: drawable=" @drawable/ic_launcher3"

o android: duration=" 200" />

o

o < /animation-list>

o res/anim/transform_anim.xml

o <? xml version=" 1.0" encoding=" utf-8"? >

o < set xmlns: android=" http: //schemas.android.com/apk/res/android"

o android: shareInterpolator=" false" >

o

o < scale

o android: duration=" 700"

o android: fillAfter=" false"

o android: fromXScale=" 1.0"

o android: fromYScale=" 1.0"

o android: interpolator=" @android: anim/accelerate_decelerate_interpolator"

o android: pivotX=" 50%"

o android: pivotY=" 50%"

o android: toXScale=" 1.4"

o android: toYScale=" 0.6" />

o

o < set android: interpolator=" @android: anim/decelerate_interpolator" >

o < scale

o android: duration=" 400"

o android: fillBefore=" false"

o android: fromXScale=" 1.4"

o android: fromYScale=" 0.6"

o android: pivotX=" 50%"

o android: pivotY=" 50%"

o android: startOffset=" 700"

o android: toXScale=" 0.0"

o android: toYScale=" 0.0" />

o

o < rotate

o android: duration=" 400"

o android: fromDegrees=" 0"

o android: pivotX=" 50%"

o android: pivotY=" 50%"

o android: startOffset=" 700"

o android: toDegrees=" -45"

o android: toYScale=" 0.0" />

o < /set>

o

o < /set>

o src/MainActivity.java

o

o package com.example.application;

o

o import android.app.Activity;

o import android.graphics.Color;

o import android.graphics.drawable.AnimationDrawable;

o import android.os.Bundle;

o import android.view.View;

o import android.view.View.OnClickListener;

o import android.view.animation.Animation;

o import android.view.animation.AnimationUtils;

o import android.widget.Button;

o import android.widget.ImageView;

o

o public class MainActivity extends Activity implements OnClickListener {

o

o private Button startFrameAnim;

o private Button startTransformAnim;

o private Button cancelAnim;

o private ImageView animationView;

o

o @Override

o public void onCreate(Bundle savedInstanceState) {

o super.onCreate(savedInstanceState);

o setContentView(R.layout.activity_main);

o

o startFrameAnim = (Button) findViewById(R.id.frameAnimationStart);

o startTransformAnim= (Button) findViewById(R.id.transformAnimationStart);

o cancelAnim = (Button) findViewById(R.id.cancelAnimation);

o animationView = (ImageView) findViewById(R.id.animationView);

o

o startFrameAnim.setOnClickListener(this);

o startTransformAnim.setOnClickListener(this);

o cancelAnim.setOnClickListener(this);

o }

o

o public void onClick(View v) {

o if (startFrameAnim.equals(v)) {

o animationView.setBackgroundResource(R.anim.frame_anim);

o AnimationDrawable animation =

o (AnimationDrawable) animationView.getBackground();

o animation.start();

o } else if (startTransformAnim.equals(v)) {

o animationView.setBackgroundResource(R.drawable.ic_launcher);

o Animation transformAnimation =

o AnimationUtils.loadAnimation(this, R.anim.transform_anim);

o animationView.startAnimation(transformAnimation);

o } else if (cancelAnim.equals(v)) {

o animationView.setBackgroundColor(Color.BLACK);

o }

o }

o }

3. Location Example

o src/MainActivity.java

o

o package com.example.application;

o

o import java.util.Date;

o

o import android.app.Activity;

o import android.location.Criteria;

o import android.location.Location;

o import android.location.LocationListener;

o import android.location.LocationManager;

o import android.os.Bundle;

o import android.widget.TextView;

o

o public class MainActivity extends Activity implements LocationListener {

o private TextView latitudeLabel;

o private TextView longitudeLabel;

o private TextView statusLabel;

o private LocationManager locationManager;

o

o @Override

o public void onCreate(Bundle savedInstanceState) {

o super.onCreate(savedInstanceState);

o setContentView(R.layout.activity_main);

o

o latitudeLabel = (TextView) findViewById(R.id.latitudeLabel);

o longitudeLabel = (TextView) findViewById(R.id.longitudeLabel);

o statusLabel = (TextView) findViewById(R.id.statusLabel);

o

o locationManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);

o }

o

o @Override

o protected void onResume() {

o super.onResume();

o // construct a criteria with best accuracy

o Criteria criteria = new Criteria();

o criteria.setAccuracy(Criteria.ACCURACY_FINE);

o // get best ENABLED provider that meets the criteria

o String provider = locationManager.getBestProvider(criteria, true);

o // request the updates

o locationManager.requestLocationUpdates(provider, 0, 0, this);

o }

o

o @Override

o protected void onPause() {

o super.onPause();

o locationManager.removeUpdates(this);

o }

o

o public void onLocationChanged(Location location) {

o statusLabel.setText(" Location recieved at " + new Date());

o latitudeLabel.setText(" Latitude: " + location.getLatitude());

o longitudeLabel.setText(" Longitude: " + location.getLongitude());

o }

o

o public void onProviderDisabled(String provider) {

o }

o

o public void onProviderEnabled(String provider) {

o }

o

o public void onStatusChanged(String provider, int status, Bundle extras) {

o }

o }

o AndroidManifest.xml

o < manifest xmlns: android=" http: //schemas.android.com/apk/res/android"

o package=" com.example.application"

o android: versionCode=" 1"

o android: versionName=" 1.0" >

o

o < uses-sdk

o android: minSdkVersion=" 8"

o android: targetSdkVersion=" 15" />

o

o < uses-permission android: name=" android.permission.ACCESS_COARSE_LOCATION" />

o < uses-permission android: name=" android.permission.ACCESS_FINE_LOCATION" />

o

o < application

o android: icon=" @drawable/ic_launcher"

o android: label=" @string/app_name" >

o < activity

o android: name=".MainActivity"

o android: label=" @string/title_activity_main" >

o < intent-filter>

o < action android: name=" android.intent.action.MAIN" />

o

o < category android: name=" android.intent.category.LAUNCHER" />

o < /intent-filter>

o < /activity>

o < /application>

o

o < /manifest>

 

Дальше > >

 

 

Лекция 2:

Intel Energy Checker SDK

Программы, особенно для мобильных устройств, могут и должны быть энергоэффективными, однако разработчики зачастую не уделяют этому показателю должного внимания. Для мобильных устройств большое значение имеет экономный расход электроэнергии, благодаря которому продлевается срок работы от аккумулятора. Поэтому пользователю предпочтительно использовать более энергоэффективные приложения. Зачастую разработчики приложений создают свои программы на настольных ПК, где показатели потребления электроэнергии намного менее существенны, чем производительность. Тем не менее, если не обращать внимания на вопросы потребления энергии, запуск программы на мобильном устройстве может обернуться для пользователя неприятной неожиданностью. Intel Energy Checker SDK измеряет количество работы, производимой системой, и соответствующее потребление энергии и позволяет тем самым определить, насколько эффективна система в части энергопотребления, и помочь в оптимизации приложения.

Уровень потребления, безусловно, является важным показателем энергоэффективности, но сам по себе он не дает полного представления о работе приложения. Малопотребляющие системы, выполняющие при этом малый объем полезной работы, могут быть менее эффективными, чем более мощные системы, способные осуществлять более значительные вычисления. Более того, даже в рамках одной системы не существует единой метрики – в зависимости от приложения ключевые показатели могут разниться. IntelEnergy Checker SDK является гибким инструментом, позволяющим разработчикам проводить измерения и контроль энергоэффективности системы.

В Intel Energy Checker SDK широко используется понятие " энергоэффективность". Повсеместно принятого определения энергоэффективности не существует, но в Intel Energy Checker SDK используется следующее:

Энергоэффективность = Работа / Энергия

Под термином " работа" понимается объем полезной работы, выполненной приложением. Простого, четкого и однозначного определения термина " полезная работа" также не существует; то, что считается полезной работой в одной программе, может не считаться таковой в другом приложении. Например, количество полезной работы, проделываемое платежным приложением, отличается от количества полезной работы, выполняемой приложением-видеосервером, программой доступа к базе данных или почтовым сервером.

Intel Energy Checker SDK API предоставляет доступ к показателям проделанной приложением полезной работы с помощью простой программной оснастки. Решение остается за разработчиком. Например, можно считать работу определенных компонентов программного видеопроигрывателя, выполняющих какую-либо работу для пользователя (например, декодирование видео), полезной работой, а действия других компонентов (получающих доступ к ресурсам, ожидающих ввода, выполняющих синхронизацию) не будут считаться полезными. Intel Energy Checker SDK позволяет разработчикам определять, какие замеры " полезной работы" важны для конкретного приложения, и предоставляет доступ к ним с помощью простого API.

Intel Energy Checker SDK API предоставляет функции экспорта и импорта счетчиков в приложения. Счетчики хранят информацию о количестве событий или процессов, другие приложения могут считывать показания этих счетчиков и осуществлять действия на основе их текущих значений. Ядро Intel Energy Checker API состоит из пяти функций, которые позволяют открывать, повторно открывать, читать, записывать и закрывать счетчики.

Первым этапом использования Intel Energy Checker SDK для определения энергоэффективности приложения является создание и применение счетчиков, определяющих объем полезной работы в программе. Счетчик – это 8-байтовая переменная, в которой хранится количество возникновений определенного события. В языке программирования C для этого используется тип данныхunsigned long. Разработчик может создать один или несколько счетчиков в ходе инициализации программного обеспечения. После этого можно создать контейнер для счетчиков, называемый " Productivity Link" (PL). Каждый PL может содержать до 512 счетчиков, одновременно может быть открыто до 10 разных PL, но для большинства программ будет достаточно гораздо меньшего числа счетчиков и PL.

Вторым этапом расчета энергоэффективности приложения является измерение объема энергии, израсходованной при работе программы. Для этого в Intel Energy Checker SDK применяются два средства, входящие в пакет SDK: Energy Server (ESRV) и Temperature Server (TSRV). ESRV используется для отслеживания потребления электроэнергии по данным внешних измерительных устройств, а TSRV отслеживает показатели температуры по данным термодатчиков.

В состав Intel Energy Checker SDK, помимо уже упомянутых средств, входят еще две вспомогательные программы:

· PL GUI Monitor – это пользовательский интерфейс (Рис. 3.4), отображающий счетчики PL в запущенной программе, совместимой с Intel Energy Checker API.

· PL CSV Logger3 – это приложение, собирающее и записывающее показатели счетчиков PL в CSV-файл для дальнейшего анализа в программах обработки электронных таблиц.


Рис. 3.4. PL GUI Monitor

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

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

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


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 95; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.291 с.)
Главная | Случайная страница | Обратная связь