» Программирование Android

Создание первого Android-приложения на конкретном примере

На данный момент происходит достаточно активное, даже бурное развитие операционной системы Android, а одновременно с самой ОС, естественно, и растет и развивается рынок программного обеспечения. Но невозможно с нуля написать успешный комплексный проект – всегда нужно начинать с чего-то более простого. Этим мы и займемся, причем попытаемся создать приложение «немного сложнее, чем Hello World», а заодно рассмотрим разные подводные камни.

Данный пример актуален, в первую очередь, применительно к созданию собственного приложения на компьютере с установленной операционной системой Windows XP, однако и другие версии Windows, и даже Linux также отлично подойдут для этих задач.

В первую очередь необходимо скачать среду разработки Eclipse – она на данный момент одна из самых популярных и удобных для выполнения поставленных задач. Скачать Eclipse можно на официальном сайте в разделе загрузок — http://www.eclipse.org/downloads/. Распаковывать архив удобнее всего в директорию C:Eclipse.

Также нужно установить ADT-плагин для Eclipse. Для этого в программе открываем «Help» -> «Install new software». В поле «Work with» прописываем адрес загрузки нужного нам плагина: dl-ssl.google.com/android/eclipse/ (плагин также можно загрузить и впоследствии установить в ручном режиме воспользовавшись ссылкой http://developer.android.com/sdk/eclipse-adt.html). В таблице будет отображено «Developer Tools» — отмечаем пункт галкой и нажимаем «Next». После завершения установки, перезагружаем Eclipse.

Нам понадобится Java Development Kit (JDK) и Java Runtime Environment (JRE), так что устанавливаем их, если они до этого не были установлены. Загрузить данные среды для разработчиков можно на официальном сайте Oracle — http://www.oracle.com/technetwork/java/javase/downloads/index.html.

Ну и, конечно, главное – нужен установленный Android SDK. Загрузить его можно на официальном сайте для разработчиков Android — http://developer.android.com/sdk/index.html. Для удобства используем директорию C:Android. После самой установки не забываем добавить все платформы и дополнительные элементы SDK. Желательно также добавить и USB-драйвер, и примеры созданных приложений для новичков.

После подготовки основных утилит можно приступить, собственно, к написанию приложения. Однако, свои творения удобнее тестировать на виртуальном Android-девайсе, то есть через эмулятор Android Virtual Device (AVD). По сути, это – виртуальный Android-смартфон, на котором без проблем можно запускать созданную программу. AVD обладает ключевым преимуществом – наглядно можно посмотреть, как приложение будет выглядеть на том или ином Android-гаджете, так как можно подставлять для эмуляции различные модели девайсов. Чтобы создать виртуальное Android-устройство, открываем меню «Window» -> «Android SDK and AVD Manager».

В правой части окна выбираем «New», и в появившемся окне вписываем имя создаваемого виртуального девайса, версию Android, размер карты памяти, разрешение экрана. После того, как задали все параметры, нажимаем «Create AVD».

Теперь непосредственно создадим наш проект. Выбираем пункт меню «File» -> «New» -> «Other», в отобразившемся списке: «Android» -> «Android Project».

За пример мы возьмем простую программу UfaTermometr, которая показывает показания датчиков температуры одной энерго-компании в Уфе.

Итак, после создания проекта, слева видно дерево директорий. Для начала, загружаем свою иконку для приложения, а если быть точнее – 3 иконки для разного разрешения экрана. В директорию drawable-hdpi помещаем иконку 72х72 пикселя в формате .png с прозрачным фоном, в директорию drawable-mdpi – 48х48 точек, а в drawable-ldpi – 36х36. Теперь приступим к элементам управления. В нашем примере нужны всего лишь три элемента пользовательского интерфейса: ImageView, для отображения логотипа приложения, Button, для обновления значения температуры и TextView – для вывода этого самого значения. Данные элементы прописываются в файле res/layout/main.xml. Разметка элементов управления очень сильно напоминает вёрстку веб-страничек с использованием тегом, присутствуют также padding, margin, а также аналог align. Приведем код, который находится в main.xml UfaTermometr:

<?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"

        >

    <ImageView android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:src="@drawable/droid"

        android:layout_gravity="center_horizontal|center"

        android:layout_margin="0px"

        />

    <Button

        android:id="@+id/refrbutton"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:gravity="center_horizontal"

        android:layout_gravity="center_horizontal|center"

        android:textSize="30px"

        android:padding="20px"

        android:layout_marginTop="10dip"

        android:text="Обновить"

        />

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="..."

        android:textSize="100dip"

        android:gravity="center_horizontal"

        android:id="@+id/temper"

        android:textColor="#EEE3C4"

        />

    </LinearLayout>

Не будем подробно останавливаться на разборе разметки элементов управления, в целом всё это интуитивно понятно по приложенному выше коду. Единственное, на что стоит обратить внимание – изображение в ImageView. В соответствующее поле src вписывается путь, который начинается с @, после чего указывается адрес изображения по дереву каталогов. В директории res была создана папка drawable, куда, собственно, и был помещен логотип. К нему и указан путь в ImageView.

Код самого приложения находится по пути src -> «указанное название package» -> «указанное название приложения».java.

По умолчанию происходит создание так называемой «болванки» основного класса, от которой и происходят все разветвления. Вся логика работы заключается в трёх простых шагах: загрузка html-страницы, где содержатся значения температуры; извлечение показателей температуры при помощи «регулярок»; отображение значений в TextView.

Если приложение нуждается в системных разрешениях, то указать их необходимо в AndroidManifest.xml. В нашем случае необходимо соединение с Интернетом, а потом в «манифест» надо добавить строку:

  <uses-permission android:name=«android.permission.INTERNET»/>

А теперь приведем код, который реализовывает описанную выше трёхшаговую логику работы приложения:

package app.test.ufatermometr;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import android.widget.Button;

import java.io.InputStreamReader;

import java.net.URL;

import java.net.URLConnection;

import java.util.regex.*;

public class UfaTermometr extends Activity

{

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        final Button button = (Button) findViewById(R.id.refrbutton);

        button.setOnClickListener(new Button.OnClickListener() {

            public void onClick(View v) // клик на кнопку

            {

                RefreshTemper();

            }

        });

        RefreshTemper(); // при запуске грузим температуру сразу

    };

    //----------------------------------------------------------------

    public String GetTemper(String urlsite) // фукция загрузки температуры

    {

        String matchtemper = "";

        try

        {

                // загрузка страницы

            URL url = new URL(urlsite);

            URLConnection conn = url.openConnection();

            InputStreamReader rd = new InputStreamReader(conn.getInputStream());

            StringBuilder allpage = new StringBuilder();

            int n = 0;

            char[] buffer = new char[40000];

            while (n >= 0)

            {

                n = rd.read(buffer, 0, buffer.length);

                if (n > 0)

                {

                    allpage.append(buffer, 0, n);                   

                }

            }

            // работаем с регулярками

            final Pattern pattern = Pattern.compile

            ("<span style="color:#[a-zA-Z0-9]+">[^-+0]+([-+0-9]+)[^<]+</span>[^(а-яА-ЯёЁa-zA-Z0-9)]+([а-яА-ЯёЁa-zA-Z ]+)");

            Matcher matcher = pattern.matcher(allpage.toString());

            if (matcher.find())

            {   

                matchtemper = matcher.group(1);           

            }       

            return matchtemper;

        }

        catch (Exception e)

        {

        }

        return matchtemper;

    };

    //----------------------------------------------------------------

    public void RefreshTemper()

    {

        final TextView tTemper = (TextView) findViewById(R.id.temper);

         String bashtemp = "";

          bashtemp = GetTemper("http://be.bashkirenergo.ru/weather/ufa/");

        tTemper.setText(bashtemp.concat("°")); // отображение температуры

    };

}

Когда приложение написано, то его, соответственно, нужно отлаживать и проводить тестирование через эмулятор и на физических Android-девайсах.

После запуска приложения через виртуальную машину, увидим следующее:

Для того, чтобы поделиться приложением с кем-то, нужно собрать .apk-файл. Выбираем «File» -> «Export», далее в списке «Export» -> «Export Android application». Выбираем экспортируемый проект, создаем хранилище ключей (keystore) и сам ключ (key) – для этого понадобится заполнить несколько полей со справочной информацией. Созданный .apk даже можно выложить в Google Play (Android Market), но для этого уже потребуется регистрация и взнос в виде $ 25. Это, конечно же, не так много, особенно если речь идет о заслуживающем внимания приложении.

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

ERROR: Unable to open class file C:workspaceTestgencomexample	estR.java: No such file or directory

Данная ошибка решается полной очисткой проекта (пункт «Project» -> «Clean») или же перезапуском среды Eclipse.

Если возникает вот такое сообщение об ошибке:

emulator: ERROR: no search paths found in this AVD's configuration. Weird, the AVD's config.ini file is malformed. Try re-creating it

То это значит, что в имени пользователя Windows содержаться кириллические символы. Для решения проблемы открываем «Компьютер» -> «Свойства системы» -> «Дополнительные параметры системы» -> «Переменные среды», где создаем новую переменную ANDROID_SDK_HOME, со значением, которое вмещает путь к папке AVD (в нашем примере это C:Android). После создания ищем переменную Path, открываем её и в поле значений через точку с запятой добавляем полный путь к директории tools от Android SDK (в нашем примере, соответственно, — C:Androidtools). Сохраняем изменения, после чего запускаем Eclipse и запускаем программу. А в целом – настоятельно рекомендуем никогда не использовать кириллицу в названиях чего-либо, а особенно в имени пользователя, такое вот золотое правило.

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

Так что всё начинается с малого, а дальше всё определяется лишь упорством и желанием!

оро
2014-01-16 19:10:55
Да, с хабра. Подтверждаю 100%.
digphone
2013-08-02 08:35:22
По-моему, с "хабра" стырено )
Косенко Сергей
2013-08-01 22:23:57
После добавления своего устройства в профиль виртуальной машины, нажимаю "ok", и компьютер виснет напрочь! Приходится перезагружать. В чем причина?