Разработка приложения для смартфонов под управлением операционной системы Android

дипломная работа

- Система улучшения пользовательского интерфейса;

- Модуль работы с интернетом;

- Модуль работы с файловой системой;

- Система кэширования.

В данном разделе будут более подробно описаны основные идеи вложенные в наиболее важные модули и системы.

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

- Контроль локализации;

- Контроль разрешения предоставляемых графических элементов пользовательского интерфейса;

- Система анимации;

- Система построения пользовательского интерфейса (частично);

- Система контроля разрешений и прав доступа приложения и его данных;

- Система интеграции сторонних приложений;

- Система организации фоновых процессов.

Подробности о каждой из систем можно найти на официальном сайте.

4.2 Модуль настроек приложения

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

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

Был разработан класс Settings.java. Рассмотрим основные его функции.

public static Settings instance() - данная функция инициализирует класс. Класс является синглтон паттерном.

public static <Type> read<Type>(String key,<Type> def) - данная функция получает значение параметра, в случае неудачи(не существует такого параметра, ошибка чтения) возвращается значение по умолчанию.

public static <Type> write<Type>(String key,<Type> def) - данный метод производит сохранение параметра и немедленную запись обновленных данных в файловую систему.

4.3 Сервис фоновых процессов

Так как приложение должно обновлять свои данные независимо от своего состояние, было принято решение разделить приложение на 2 части.

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

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

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

Подробнее о менеджере данных будет рассмотрено в следующем разделе.

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

private class TimeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

AppHandler.instance().postDelayed(new Runnable() {

@Override

public void run() {

// Log.d(TAG, "obeying the time-tick");

ManagersController.instance().updateAll();

}

}, timeOffset);

}

}

4.4 Модуль работы с ресурсами

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

while (true) {

CacheData obj = get();

if (obj != null) { //Есть ли запросы на загрузку

Message msg = new Message();

Bitmap img; //есть ли в оперативной памяти?

if (isLoaded(obj.name, obj.section)) img =

getLoaded(obj.name, obj.section); //загружаем в память

else img = ImageManaer.instance().getImage(obj.name, obj.section);

//выполняем синхронное возвращение в

//запасивший загрузку поток

msg.obj = new Duplex<Long, Bitmap>(obj.timestamp, img);

obj.handler.sendMessage(msg);

} else try {

sleep(1000);

} catch (Exception ignored) {

}

}

4.5 Система шифрования и защиты данных

Данное приложение использует персональные данные устройства для авторизации на сервере обновлений, что означает передачу данных. Так как передача данных не гарантирует защищенности данных, было принято решение шифровать данные. Алгоритм шифрования применяемый в приложении - SHA1. Разработанный класс SimpleCrypto предоставляет 3 основных метода.

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception - Данный метод выполняет шифрование данных по набору байт данный и ключу.

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception - Данный метод выполняет дешифрование данных по набору байт данный и ключу.

private static byte[] getRawKey(byte[] seed) throws Exception - Данный метод генерирует ключ шифрования для последующих операций шифрование и дешифрования. Данный функционал выполнен в режим подключаемой библиотеке, так как должен выполнятся как на клиентском устройстве, так и на серверной части.

4.6 Модуль конвертации данных

Так как приложение получает данные из интернета, требуются методы разбора данных и занесения их в соответствующие переменные. Данные получаются приоритетно в формате JSON, однако часть данных приходит в форматах XML и RAW. Для преобразования и парсинга(парсинг - разбор и преобразование данных из одного формата в другой) были разработанные соответствующие классы: JsonToObjectsConverter, XmlToObjectConverter, RawToObjectConverter. Как понятно из названий, каждый класс выполняет конвертации соответствующего типа данных. Также каждый класс является паттеном синглтон, что позволяет в значительной степени избежать утечки и лишних затрат памяти.

Каждый класс предоставляет метод конвертации данных, для примера класс JsonToObjectsConverter содержит метод

public Object makeObjectFromJsonString(String json, Class objectClass){…} - Как видно в качестве параметров принимается строка данных в фомате JSON, а также тип данных к которым нудно привести.

Делись добром ;)