Разработка приложения для вывода актуальных маршрутов движения пригородного транспорта Владимирской области

Создание приложения для получения информации о расписании движения междугороднего транспорта Владимирской области. Параметры совместимости приложения с различными версиями Android. Схема взаимодействия между классами. Описание внешнего вида интерфейса.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 17.02.2016
Размер файла 2,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Владимирский государственный университет имени Александра Григорьевича и Николая Григорьевича Столетовых»

Контрольная работа

по дисциплине Портативные вычислительные системы

Тема: "Разработка приложения для вывода актуальных маршрутов движения пригородных транспортов владимирской области"

Выполнил: Кузин Ю.С.

Принял: Касьянов А.А.

Владимир, 2015

Содержание

  • Введение
  • 1. Анализ задания
  • 1.1 Задание
  • 1.2 Анализ задания
  • 2. Описание структуры приложения
  • 2.1 Параметры совместимости приложения с различными версиями Android
  • 2.2 Схема взаимодействия между классами
  • 2.3 Службы, используемые при установке приложения
  • 2.4 Схема взаимодействия компонентов проекта в виде UML - диаграмм
  • 3. Описание внешнего вида интерфейса приложения
  • 4. Описание диаграммы классов Java, используемых в приложении
  • 5. Результаты отладки и тестирования приложения на различных устройствах
  • 5.1 Galaxy Nexus 5 - 6.0 - API 23 - 1080x1920
  • 5.2 Google Galaxy Nexus - 4.2.2 - API 19 - 720x1280
  • 5.3 Google Nexus 4 - 5.0.0 API 21 - 720x1280
  • Вывод
  • Список используемой литературы
  • Приложения

Введение

Данная работа направлена на создание приложения для получения информации о расписании движения междугороднего транспорта Владимирской области для операционной системы Andriod и закрепления навыков программирования для этой системы.

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

Для разработки приложения использовалась версия Android Studio.

1. Анализ задания

1.1 Задание

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

1.2 Анализ задания

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

Пункты отправления и прибытия должны находиться во Владимирской области.

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

2. Описание структуры приложения

2.1 Параметры совместимости приложения с различными версиями Android

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

Данное приложение разработано и протестировано на SDK версии 20. Однако система Android обеспечивает совместимость для ранних версий. Таким образом, минимальная версия SDK для запуска приложения - 15.

2.2 Схема взаимодействия между классами

Схема взаимодействия между классами приложения представлена на рисунке 2.1.

Рис. 2.1 - Схема взаимодействия между классами.

2.3 Службы, используемые при установке приложения

Для ввода значений пунктов отправления и назначения используется экранная клавиатура Android.

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

Приложение при установке требует разрешение, прописанное в файле AndroidManifest.xml: <uses-permission android:name="android.permission.INTERNET"/> - позволяет приложению , открывать сетевые сокеты.

2.4 Схема взаимодействия компонентов проекта в виде UML - диаграмм

Рис 2.2 - Взаимодействие компонентов приложения.

Основу приложения составляют два класса:

1) Класс MyActivity - класс главной активити. Содержит в себе средства ввода и отображения информации.

2) Класс YandexSchedule - класс, осуществляющий формирование запроса и обработку ответа сервера. Выполняется в отдельном потоке и осуществляет подключение к сети.

3. Описание внешнего вида интерфейса приложения

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

По нажатию на кнопку «Поменять местами» с изображенными стрелками пользователь может поменять местами пункты отправления и прибытия.

Рис. 3.1 - Главный экран приложения.

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

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

Рис. 3.2 - Отображение расписания.

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

Рис. 3.3 - Подробная информация о рейсе.

Выход из приложения осуществляется стандартными средствами Android.

4. Описание диаграммы классов Java, используемых в приложении

Общая диаграмма классов представлена на рисунке 4.1.

Рис. 4.1 - Диаграмма классов приложения

Класс Rout используется для формирования, хранения и передачи информации о маршруте внутри приложения. Содержит поля, соответствующие параметрам рейсов, а также методы получения и установки значений для каждого из полей. Также описан конструктор, позволяющий сформировать экземпляр класса напрямую из объекта, принадлежащему классу org.json.JSONObject.

Класс YandexSchedule наследует класс AsyncTask<String, Void, List<Rout>> и является примером реализации фоновой задачи Android. Содержит два поля: префикс URL-адреса для запроса и exception класса Exception, служащий для корректного оповещения о произошедший исключительных ситуациях. Унаследованный метод doInBackground(String... strings) определяет, что будет выполнять объект класса в фоновом режиме. Метод getSchedule осуществляет конкатенацию строки для запроса и вызов метода parse(String address). В свою очередь, этот метод осуществляет GET-запрос сервису Яндекс Расписания и обрабатывает ответ сервера. В случае удачного завершения метод возвращает список объектов типа Rout. Иначе - определяет поле класса exception, по которому позже можно будет судить о произошедшей исключительной ситуации.

Класс MyActivity наследует класс Activity. В этом классе определена логика отображения данных. Среди прочих полей класса присутствуют поле типа YandexSchedule и поле, содержащее список объектов типа Rout.

Унаследованный метод void onCreate(Bundle savedInstanceState) определяет, что произойдет при создании MyActivity. Здесь же назначаются слушатели на все кнопки, а также происходит инициация диалоговых окон с помощью метода initInfoDialogBuilder() и определения обработчиков событий.

Логика получения данных и их корректного отображения описана в методе boolean getSchedule(). Объекта класса YandexSchedule получает список маршрутов, который отображается с помощью класса ListView.

Метод String getCodeByPlaceName(String placeName) позволяет определить, находится ли выбранное местоположение в пределах Владимирской области путем сверения со списком имеющихся станций, а также получить их коды для составления запроса сервису Яндекс Расписания.

5. Результаты отладки и тестирования приложения на различных устройствах

5.1 Galaxy Nexus 5 -6.0 - API 23 - 1080x1920

Рис. 5.1 Тестирование на устройстве Galaxy Nexus 5

Лог файл

01-22 19:33:58.123 1264-1264/com.example.schedule D/dalvikvmЎR Late-enabling CheckJNI

01-22 19:33:58.363 1264-1264/com.example.schedule D/dalvikvmЎR GC_FOR_ALLOC freed 77K, 10% free 4246K/4700K, paused 59ms, total 59ms

01-22 19:33:58.387 1264-1264/com.example.schedule I/dalvikvm-heapЎR Grow heap (frag case) to 12.423MB for 8294412-byte allocation

01-22 19:33:58.411 1264-1273/com.example.schedule D/dalvikvmЎR GC_FOR_ALLOC freed 1K, 4% free 12345K/12804K, paused 23ms, total 23ms

01-22 19:33:58.647 1264-1264/com.example.schedule D/dalvikvmЎR GC_FOR_ALLOC freed <1K, 4% free 12345K/12804K, paused 28ms, total 28ms

01-22 19:33:58.727 1264-1264/com.example.schedule I/dalvikvm-heapЎR Grow heap (frag case) to 15.938MB for 3686412-byte allocation

01-22 19:33:58.739 1264-1273/com.example.schedule D/dalvikvmЎR GC_FOR_ALLOC freed <1K, 3% free 15945K/16408K, paused 11ms, total 11ms

01-22 19:33:58.899 1264-1264/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libEGL_genymotion.so

01-22 19:33:58.903 1264-1264/com.example.schedule D/ЎR HostConnection::get() New Host Connection established 0xb7fa6278, tid 1264

01-22 19:33:58.915 1264-1264/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libGLESv1_CM_genymotion.so

01-22 19:33:58.915 1264-1264/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libGLESv2_genymotion.so

01-22 19:33:59.047 1264-1264/com.example.schedule W/EGL_genymotionЎR eglSurfaceAttrib not implemented

01-22 19:33:59.051 1264-1264/com.example.schedule E/OpenGLRendererЎR Getting MAX_TEXTURE_SIZE from GradienCache

01-22 19:33:59.055 1264-1264/com.example.schedule E/OpenGLRendererЎR Getting MAX_TEXTURE_SIZE from Caches::initConstraints()

01-22 19:33:59.055 1264-1264/com.example.schedule D/OpenGLRendererЎR Enabling debug mode 0

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

5.2 Google Galaxy Nexus - 4.2.2 - API 19 - 720x1280

Рис. 5.2 Тестирование на устройстве Google Galaxy Nexus

Лог-файл

01-22 19:50:07.479 1110-1110/com.example.schedule D/dalvikvm? GC_FOR_ALLOC freed 1K, 5% free 12205K/12828K, paused 6ms, total 6ms

01-22 19:50:07.487 1110-1110/com.example.schedule I/dalvikvm-heap? Grow heap (frag case) to 15.971MB for 3686412-byte allocation

01-22 19:50:07.499 1110-1118/com.example.schedule D/dalvikvm? GC_FOR_ALLOC freed <1K, 4% free 15804K/16432K, paused 12ms, total 12ms

01-22 19:50:07.507 1110-1113/com.example.schedule D/dalvikvm? GC_CONCURRENT freed 0K, 4% free 15805K/16432K, paused 1ms+2ms, total 6ms

01-22 19:50:07.631 1110-1110/com.example.schedule D/libEGL? loaded /system/lib/egl/libEGL_genymotion.so

01-22 19:50:07.631 1110-1110/com.example.schedule D/? HostConnection::get() New Host Connection established 0xb7b999b0, tid 1110

01-22 19:50:07.643 1110-1110/com.example.schedule D/libEGL? loaded /system/lib/egl/libGLESv1_CM_genymotion.so

01-22 19:50:07.643 1110-1110/com.example.schedule D/libEGL? loaded /system/lib/egl/libGLESv2_genymotion.so

01-22 19:50:07.779 1110-1110/com.example.schedule W/EGL_genymotion? eglSurfaceAttrib not implemented

01-22 19:50:07.799 1110-1110/com.example.schedule D/OpenGLRenderer? Enabling debug mode 0

01-22 19:50:46.359 1110-1110/com.example.schedule W/EGL_genymotion? eglSurfaceAttrib not implemented

Ошибок не обнаружено.

5.3 Google Nexus 4 - 5.0.0 API 21 - 720x1280

Рис. 10 Тестирование на устройстве ASUS TF101G(Главный экран)

Лог-файл

01-23 12:58:57.916 2159-2174/com.example.schedule W/artЎR Suspending all threads took: 5.680ms

01-23 12:58:57.922 2159-2174/com.example.schedule I/artЎR Background partial concurrent mark sweep GC freed 217(31KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 5MB/9MB, paused 8.395ms total 32.555ms

01-23 12:58:58.428 2159-2178/com.example.schedule D/OpenGLRendererЎR Render dirty regions requested: true

01-23 12:58:58.434 2159-2159/com.example.schedule D/ЎR HostConnection::get() New Host Connection established 0xacf1d7c0, tid 2159

01-23 12:58:59.182 2159-2159/com.example.schedule D/AtlasЎR Validating map...

01-23 12:59:00.142 2159-2178/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libEGL_emulation.so

01-23 12:59:00.142 2159-2178/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libGLESv1_CM_emulation.so

01-23 12:59:00.158 2159-2178/com.example.schedule D/libEGLЎR loaded /system/lib/egl/libGLESv2_emulation.so

01-23 12:59:00.166 2159-2178/com.example.schedule D/ЎR HostConnection::get() New Host Connection established 0xa4516120, tid 2178

01-23 12:59:00.190 2159-2178/com.example.schedule I/OpenGLRendererЎR Initialized EGL, version 1.4

01-23 12:59:00.337 2159-2178/com.example.schedule D/OpenGLRendererЎR Enabling debug mode 0

01-23 12:59:00.352 2159-2178/com.example.schedule W/EGL_emulationЎR eglSurfaceAttrib not implemented

Ошибок не обнаружено.

В ходе тестирования данного приложения было проведено тестирование программы на различных версиях ОС Android:

· Android Google 4.2.2

· Android Google 5.0.0

· Android Google 6.0.0

А так же для различных разрешений:

· 1080x1920

· 720x1280

Тестирование проводилось при помощи эмулятора встроенного эмулятора Android Studio. Данный вид тестирования эквивалентен отладке приложения через интерфейс USB на реальном устройстве.

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

интерфейс приложение движение транспорт

Вывод

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

В результате выполнения курсовой работы был получен опыт в разработке приложений, закреплены навыки программирования на платформе Android. В качестве отправной точки работы был выбран сайт rasp.yandex.ru. Изучены и осмыслены принципы стороннего взаимодействия систем в операционной системе Android.

В качестве предложений по модернизации и развитию данного приложения есть несколько направлений:

· Опубликовать приложение в магазине «Google Play»

· Расширить географию приложения, добавив возможность получения расписания движения транспорта без привязки исключительно ко Владимирской области.

· Доработать графический интерфейс программы, добавить анимированные изображения и анимации переходов.

· Добавить выбор различных цветовых схем оформления приложения

Список используемой литературы

1. Android Developers [Электронный ресурс]. - Режим доступа: http://developer.android.com/index.html

2. Голощапов А. Л. Google Android. Программирование для мобильных устройств. - СПб: БХВ-Петербург, 2011. - 448 c.

3. Рето Майер Android 2: Программирование приложений для планшетных компьютеров и смартфонов. - М: Эксмо, 2011. - 672 с.

Приложения

Приложение А. Исходный код приложения

Класс MyActivity.java

public class MyActivity extends Activity {

private boolean firstClick = true;

private YandexSchedule yandexSchedule = new YandexSchedule();

private List<Rout> routList = new ArrayList<Rout>();

private DatePickerDialog datePickerDialog;

private int year;

private int month;

private int day;

private AlertDialog.Builder infoDialogBuilder;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_my);

//Обработка нажания клавиши Найти

Button searchButton = (Button)findViewById(R.id.findButton);

searchButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

if (getSchedule() && firstClick) {

searchBtnClickAnimation();

firstClick = false;

}

}

});

//Обработка нажатия клавиши Поменять местами

ImageButton swapButton = (ImageButton)findViewById(R.id.swapButton);

swapButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

swapPlaces();

}

});

//Создание DatePickerDialog и добавление слушателя

DatePickerDialog.OnDateSetListener dateCallback = new DatePickerDialog.OnDateSetListener() {

@Override

public void onDateSet(DatePicker datePicker, int y, int m, int d) {

changeDate(y, m, d);

}

};

GregorianCalendar calendar = new GregorianCalendar();

calendar.setTime(new Date());

changeDate(calendar.get(Calendar.YEAR),

calendar.get(Calendar.MONTH),

calendar.get(Calendar.DAY_OF_MONTH));

datePickerDialog = new DatePickerDialog(this, dateCallback, year, month, day);

//Обработка нажания кнопки Календарь

ImageButton calendarButton = (ImageButton)findViewById(R.id.calendarImageButton);

calendarButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

datePickerDialog.show();

}

});

//Обработка нажания на элемент списка ListView

initInfoDialogBuilder();

ListView listView = (ListView)findViewById(R.id.listView);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

//Toast.makeText(getApplicationContext(), String.format("i = %d, l = %d", i, l), Toast.LENGTH_SHORT).show();

showInfoAboutRout(routList.get(i));

}

});

}

private void searchBtnClickAnimation(){

Animation anim = AnimationUtils.loadAnimation(this, R.anim.up_menu);

GridLayout gridLayout = (GridLayout)findViewById(R.id.gridLayout);

gridLayout.startAnimation(anim);

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)gridLayout.getLayoutParams();

params.addRule(RelativeLayout.ALIGN_PARENT_TOP);

gridLayout.setLayoutParams(params);

EditText text1 = (EditText)findViewById(R.id.fromEditText);

((GridLayout.LayoutParams)text1.getLayoutParams()).setMargins(0, 2, 0, 2);

EditText text2 = (EditText)findViewById(R.id.toEditText);

((GridLayout.LayoutParams)text2.getLayoutParams()).setMargins(0, 2, 0, 2);

ImageButton swapButton = (ImageButton)findViewById(R.id.swapButton);

((GridLayout.LayoutParams)swapButton.getLayoutParams()).setMargins(0, -3, 0, -2);

}

private boolean getSchedule(){

String from = ((EditText)findViewById(R.id.fromEditText)).getText().toString();

String to = ((EditText)findViewById(R.id.toEditText)).getText().toString();

if (from.equals("") || to.equals("")){

Toast.makeText(getApplicationContext(), "Поля не заполнены.", Toast.LENGTH_LONG).show();

return false;

}

try {

String fromCode = getCodeByPlaceName(from);

String toCode = getCodeByPlaceName(to);

yandexSchedule.execute(fromCode, toCode, String.format("%d-%d-%d", year, (month + 1), day));

routList = yandexSchedule.get();

if (routList == null)

throw yandexSchedule.getException();

ListView listView = (ListView)findViewById(R.id.listView);

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)listView.getLayoutParams();

params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;

List<String> itemList = new ArrayList<String>();

for (Rout rout : routList) {

String info = String.format("%s,\t\t%s", rout.getThread_title(), transformDatetime(rout.getDeparture()));

itemList.add(info);

}

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, itemList);

listView.setAdapter(adapter);

listView.setVisibility(ListView.VISIBLE);

} catch (XmlPullParserException e) {

Toast.makeText(getApplicationContext(), "Не удалось определить код местоположения.", Toast.LENGTH_LONG).show();

return false;

} catch (IOException e) {

Toast.makeText(getApplicationContext(), "Ошибка получения данных. Проверьте подклбчение к сети.", Toast.LENGTH_LONG).show();

return false;

} catch (IllegalArgumentException e){

Toast.makeText(getApplicationContext(), "Неизвестное местоположение.", Toast.LENGTH_LONG).show();

return false;

} catch (Exception e) {

Toast.makeText(getApplicationContext(), "Неизвестная ошибка.", Toast.LENGTH_LONG).show();

return false;

} finally{

yandexSchedule = new YandexSchedule();

}

return true;

}

private String getCodeByPlaceName(String placeName) throws XmlPullParserException, IOException {

String code = null;

XmlPullParser parser = getResources().getXml(R.xml.place_names);

while (parser.getEventType() != XmlPullParser.END_DOCUMENT){

if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("place")){

if (parser.getAttributeValue(0).equalsIgnoreCase(placeName))

code = parser.getAttributeValue(1);

}

parser.next();

}

if (code == null)

throw new IllegalArgumentException();

return code;

}

private void swapPlaces(){

EditText from = (EditText)findViewById(R.id.fromEditText);

String text = from.getText().toString();

EditText to = (EditText)findViewById(R.id.toEditText);

from.setText(to.getText());

to.setText(text);

}

private void changeDate(int y, int m, int d){

year = y;

month = m;

day = d;

TextView dateView = (TextView)findViewById(R.id.dateTextView);

dateView.setText("" + day + "." + (month + 1) + "." + year);

}

private void initInfoDialogBuilder(){

infoDialogBuilder = new AlertDialog.Builder(this)

.setTitle("Информация о рейсе")

.setCancelable(false)

.setNegativeButton("Закрыть", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

dialogInterface.cancel();

}

});

}

private void showInfoAboutRout(Rout rout){

String transportType = rout.getTransportType();

if ("plane".equals(transportType)){

transportType = "Самолет";

} else if ("train".equals(transportType)){

transportType = "Поезд";

} else if ("suburban".equals(transportType)){

transportType = "Электричка";

} else if ("bus".equals(transportType)){

transportType = "Автобус";

} else if ("sea".equals(transportType)){

transportType = "Морской транспорт";

} else if ("river".equals(transportType)){

transportType = "Речной транспорт";

} else if ("helicopter".equals(transportType)){

transportType = "Вертолет";

} else

transportType = "Транспорт";

String departure = ((rout.getFrom_title().equals("")) ? ("") : (rout.getFrom_title() + ", ")) + transformDatetime(rout.getDeparture());

String arrival = ((rout.getTo_title().equals("")) ? ("") : (rout.getTo_title() + ", ")) + transformDatetime(rout.getArrival());

String vehicle = ((rout.getVehicle() == null) ? ("Неизвестен") : (rout.getVehicle()));

Spanned message = Html.fromHtml(String.format("<b>Рейс:</b><br>\t%s<br>"

+ "<b>Отправление:</b><br>\t%s<br>"

+ "<b>Прибытие:</b><br>\t%s<br>"

+ "<b>%s:</b><br>\t%s",

rout.getThread_title(),

departure,

arrival,

transportType, vehicle));

infoDialogBuilder.setMessage(message);

infoDialogBuilder.show();

}

private String transformDatetime(String old){

String[] datetime = old.split(" ");

String time = datetime[1].substring(0, 5);

return time + " " + datetime[0].replace('-', '/');

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.my, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

Класс YandexSchedile.java

public class YandexSchedule extends AsyncTask<String, Void, List<Rout>>{

//адрес сервиса Yandex Расписание

private final String urlPrefix = "https://api.rasp.yandex.net/v1.0/search/?apikey=0a55b0b3-3d96-4f0a-809e-bc823323d3e7&format=json&";

private Exception exception = null;

public Exception getException() {

return exception;

}

@Override

protected List<Rout> doInBackground(String... strings) {

try {

return getSchedule(strings[0], strings[1], strings[2]);

} catch (Exception e) {

this.exception = e;

return null;

}

public List<Rout> getSchedule(String fromCode, String toCode, String date) throws IOException, JSONException {

String address = String.format("from=c%s&to=c%s&lang=ru&date=%s", fromCode, toCode, date);

return parse(address);

}

private List<Rout> parse(String address) throws IOException, JSONException {

URL url = new URL(urlPrefix + address);

HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection();

urlConnection.connect();

InputStream iStream = urlConnection.getInputStream();

StringBuilder buffer = new StringBuilder();

BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));

String line;

while ((line = reader.readLine()) != null){

buffer.append(line);

}

List<Rout> routs = new ArrayList<Rout>();

JSONArray threads = new JSONObject(buffer.toString()).getJSONArray("threads");

for (int i=0; i< threads.length(); i++) {

Rout rout = new Rout(threads.getJSONObject(i));

routs.add(rout);

}

return routs;

}

}

Класс Rout.java

package yandex;

import org.json.JSONException;

import org.json.JSONObject;

public class Rout {

private String thread_title;

private String to_title;

private String from_title;

private String vehicle;

private String transportType;

private String arrival;

private String departure;

public Rout(JSONObject rout) throws JSONException {

arrival = rout.getString("arrival");

departure = rout.getString("departure");

JSONObject thread = rout.getJSONObject("thread");

thread_title = thread.getString("title");

vehicle = thread.getString("vehicle");

transportType = thread.getString("transport_type");

//TODO возможно, сначала нужно проверять popular_title на пустоту

to_title = rout.getJSONObject("to").getString("popular_title");

from_title = rout.getJSONObject("from").getString("popular_title");

}

public String getThread_title() {

return thread_title;

}

public void setThread_title(String thread_title) {

this.thread_title = thread_title;

}

public String getTo_title() {

return to_title;

}

public void setTo_title(String to_title) {

this.to_title = to_title;

}

public String getFrom_title() {

return from_title;

}

public void setFrom_title(String from_title) {

this.from_title = from_title;

}

public String getVehicle() {

return vehicle;

}

public void setVehicle(String vehicle) {

this.vehicle = vehicle;

}

public String getTransportType() {

return transportType;

}

public void setTransportType(String transportType) {

this.transportType = transportType;

}

public String getArrival() {

return arrival;

}

public void setArrival(String arrival) {

this.arrival = arrival;

}

public String getDeparture() {

return departure;

}

public void setDeparture(String departure) {

this.departure = departure;

}

}

Файл activity_my.xml

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

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context=".MyActivity"

android:background="@drawable/wallpaper"

android:id="@+id/relativeLayout">

<GridLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:columnCount="5"

android:rowCount="3"

android:id="@+id/gridLayout"

android:layout_gravity="center"

android:layout_centerInParent="true">

<EditText

android:layout_width="200dp"

android:layout_height="25dp"

android:id="@+id/fromEditText"

android:layout_row="0"

android:layout_column="0"

android:background="#b9ffffff"

android:layout_gravity="fill"

android:inputType="text"

android:layout_columnSpan="4"

android:hint="@string/fromHint"

android:layout_marginTop="10dp"

android:layout_marginBottom="10dp" />

<ImageButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/swapButton"

android:layout_gravity="fill"

android:layout_row="0"

android:layout_column="4"

android:layout_rowSpan="2"

android:src="@drawable/doublearrow"

android:layout_marginTop="8dp"

android:layout_marginBottom="3dp" />

<EditText

android:layout_width="200dp"

android:layout_height="25dp"

android:id="@+id/toEditText"

android:layout_row="1"

android:layout_column="0"

android:background="#b9ffffff"

android:layout_gravity="fill"

android:layout_columnSpan="4"

android:inputType="text"

android:hint="@string/toHint"

android:layout_marginTop="10dp"

android:layout_marginBottom="10dp" />

<ImageButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/calendarImageButton"

android:layout_row="2"

android:layout_column="1"

android:layout_gravity="fill"

android:layout_columnSpan="1"

android:src="@drawable/calendar" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/dateTextView"

android:layout_gravity="fill"

android:layout_row="2"

android:layout_column="0"

android:gravity="center_vertical|center_horizontal"

android:textColor="#ffffffff"

android:textStyle="bold"

android:textSize="16sp"

android:typeface="normal" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/findButtonText"

android:id="@+id/findButton"

android:layout_row="2"

android:layout_column="3"

android:layout_gravity="fill"

android:layout_columnSpan="2"

android:textSize="22sp" />

</GridLayout>

<ListView

android:layout_width="wrap_content"

android:layout_height="50dp"

android:id="@+id/listView"

android:layout_below="@+id/gridLayout"

android:layout_alignParentLeft="true"

android:layout_alignParentStart="true"

android:choiceMode="none"

android:layout_alignParentRight="true"

android:background="#64ffffff"

android:visibility="invisible" />

</RelativeLayout>

Приложение Б

Жизненный цикл приложения

Размещено на Allbest.ru


Подобные документы

  • Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.

    курсовая работа [1,6 M], добавлен 19.04.2017

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

    дипломная работа [1,2 M], добавлен 04.02.2016

  • Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.

    курсовая работа [167,8 K], добавлен 18.01.2017

  • Разработка приложений для смартфонов на ОС Android для сети аптек "Фармация". Архитектура операционной системы Android. Архитектура и реализация приложения. Его функциональность. Описание работы мобильного приложения. Расчет затрат на создание продукта.

    дипломная работа [1,6 M], добавлен 17.06.2017

  • Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.

    дипломная работа [1,5 M], добавлен 09.11.2016

  • Создание приложения для Android на языке Java. Переключатель языка и варианты перевода, которые появляются, когда пользователь вводит текст в поле. Возможность просмотра истории переводов. Разработка и подготовка вида экранов тестового приложения.

    курсовая работа [114,8 K], добавлен 03.08.2017

  • Средства разработки развивающих и обучающих игр и используемой программы. Среда выполнения и Dalvik. Разработка приложения для платформы Android. Графический интерфейс и обработка касаний экрана. Разработка экранов приложения и их взаимодействия.

    дипломная работа [2,1 M], добавлен 18.01.2016

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

    дипломная работа [4,1 M], добавлен 24.04.2013

  • Реализация проекта по оптимизации отделений почтовой связи. Направления деятельности в области кадровой политики. Автоматизация обработки получаемой техническим отделом информации. Разработка приложения клиент-сервер. Описание клиентского приложения.

    курсовая работа [34,3 K], добавлен 07.08.2013

  • Проектирование и реализация мобильной версии приложения учета и движения товаров на базе платформы Android и языка программирования Java. Создание таблиц базы данных. Взаимодействие объектов и экранные формы. Способы идентификации классов анализа.

    дипломная работа [1,8 M], добавлен 01.09.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.