Давно хотелось попробовать что-то написать под Android, заодно и освежить воспоминания о Java. Пару последних дней поигрался с Android SDK и если сравнивать с когда опробованным JavaME, то много что поменялось: новая виртуальная машина, которая теперь называется Dalvik, Linux бегущий в фоне и управляющий железом, распределением памяти, жизнью процессов, разные SQLite, WebKit, OpenGL и куча другого, вплоть до управления GPS, WiFi, потоками.
Начнем с установки Android SKD и Eclipse под Ubuntu 10.04 64 bit.
Установка Android SDK
Перед установкой последних доступных версий JDK и JRE необходимо добавить репозиторий partner.
sudo add-apt-repository 'deb http://archive.canonical.com/ubuntu lucid partner' sudo aptitude update sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk
Проверим установленную версию Java
java -version
Скачиваем подготовительные файлы SDK тут и распаковываем
tar xfvz android-sdk_r07-linux_x86.tgz -C /opt/
Перейдем в папку с только-что распакованными файлами и запустим файл android, который позволит поставить необходимую версию SDK + документацию
cd /opt/android-sdk-linux_x86/tools ./android
В открывшемся окне выбираем Available Packages и выбираем пакеты для установки, я выбрал две последних версии SDK 2.1 и 2.2 и документации для них, нажимаем Install Selected.
Для разработки под Android можно использовать ваш любимый редактор (например, gvim :), пример есть тут ) + набор разных консольных утилит, из только-что установленного файла android-sdk_r07-linux_x86.tgz. Либо установить Eclipse и ADT, этот вариант немного проще, как в плане установки так и дальнейшего использования.
Последнюю версию Eclipse берем тут либо ставим доступную из репозиториев:
sudo apt-get install eclipse
Установим (ADT) Android Development Tools, для этого запустим Eclipse и перейдем в Help » Install New Software.... Нажимаем Add..., в Name вводим ADT, в Location - https://dl-ssl.google.com/android/eclipse/, нажимаем OK. Устанавливаем. После установки разрешаем перезапуск Eclipse.
Теперь осталось только связать ADT с SDK, для этого в Eclipse открываем меню Window » Preferences, в вкладке Android, есть параметр SDK Location, в нем указываем путь к установленному SDK, в моем случаи это /opt/android-sdk-linux_x86/.
С установкой все, теперь приступим к созданию проекта и написанию приложение.
Первое приложение
Создадим проект для нового приложения:
Project name: HelloWorld Build Target: [x] Android 2.1-update1 Application name: HelloWorld Package name: com.example.helloworld [x] Create Activity: HelloWorld Min SDK Version: 7
Еще нам понадобится эмулятор Android, под которым мы будем тестировать приложения.
В меню Eclipse, выбираем Run » Run Cinfigurations, в открывшемся окне выбираем Android Application, нажимаем New launch configuration, вводим имя, например avd. Справа, на закладке Android, в поле Project выбираем наш проект HelloWorld. В Launch Action выбираем Launch Default Activity.
На закладке Target, в Deployment Target Selection Mode, выбираем Automatic, нажимаем Manager.... В открывшемся окне, в Virtual Devices, нажимаем New... и вводим параметры для эмулируемого устройства на Android. Я выбрал такие:
Теперь можем приступить к самой вкусной части - написанию первого приложения.
Немного лирического отступления, Android приложения имеют ограниченный контроль над собственным жизненным циклом, т.е. более-менее серозное приложение должно быть готово к экстренному завершению, т.к. когда среда выполнения Android освобождает ресурсы то ваше приложение может быть выгружено без каких либо предупреждений (последние относится только к неактивным приложениям, у активных приложений есть небольшие привилегии :) ). Внутри самого приложения есть набор компонентов, которые слушают события внутри приложения и реагируют должным образом. Каждое приложение запускается в собственном процессе, в своем экземпляре виртуальной машины Dalvik.
Проект с Android приложением состоит из набора папок и файлов. Опишу только те, что понадобятся в нашем приложении.
Имхо, любое первое GUI-приложение должно содержать пример работы с обработчиком события клика по кнопке, желательно что-бы после этого где-то произошло изменения, например, вывелся текст 'Hello world' - тогда наглядно видно как устроен процесс взаимодействия внутри приложения. В нашем первом приложении будет поле для ввода текста, у него будет label, указывающий на приглашение ввода, кнопка, которая будет очищать текстовое поле и еще небольшой бонус - рисунок, клик по которому выведет в текстовое поле слово 'Android'.
Внешний вид приложения.
Приступим-с. Начнем с файла values/layout.xml - xml-файл, в котором описан внешний вид нашего приложения. В нем есть 5 визуальных компонентов:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Enter text" /> <EditText android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Your text ..." /> <Button android:id="@+id/myButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Clear" android:onClick="clearText" /> <ImageView android:src = "@drawable/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="sayAndroid" /> </LinearLayout>
В папку res/drawable-mdpi загрузим файл android.png (есть в файле проекта, прикрепленного в конце поста) с рисунком, для визуального компонента ImageView.
Теперь рассмотрим java-файл, в котором все действие и происходит. Для тех, кто когда-то писал на Java, или пишет сейчас, тут все почти знакомо, за исключением пары моментов.
package com.example.helloworld; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class HelloWorld extends Activity { Button btn; EditText ed; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.btn = (Button)findViewById(R.id.myButton); this.ed = (EditText)findViewById(R.id.myEditText); } public void clearText(View theButton) { this.ed.setText(""); } public void sayAndroid(View theButton) { this.ed.setText("Android"); } }
Класс нашего приложения унаследован от Activity, который в терминах Android представляет собой форму, на которой размещаются все визуальные компоненты. Метод onCreate вызывается при запуске приложения. Внутри этого метода мы сначала вызываем метод onCreate базового класса, затем метод setContentView размещает все компоненты на форме, которые описаны в файла layout/main.xml. Класс R генерируется автоматически, при компиляции приложения и содержит ссылки на некоторые ресурсы приложения, в данном случаи методу setContentView передается ссылка на главную форму. Дальше мы находим (метод findViewById) кнопку и текстовое поле по их ID и создаем соответствующие переменные внутри класса.
Метод clearText является обработчиком клика по кнопке и просто очищает текстовое поле. Метод sayAndroid является обработчиком клика по изображению и устанавливает текст внутри текстового поле на 'Android'.
На этом все, запускаем эмулятор Android и пробуем наше приложение.
Проект Eclipse тестового приложения - android_helloworld.tar.gz
Дополнительное чтиво: