Публикация на тему

Mobile Operating Systems


Programming with Mobile Applications includes Android, iOS and Windows Phone 7.



Автор

Михалькевич Александр Викторович


Публикация

Наименование Mobile Operating Systems

Автор А.В.Михалькевич

Специальность Programming with Mobile Applications includes Android, iOS and Windows Phone 7.,

Анотация

Anotation in English

Ключевые слова

Количество символов 199210

Содержание

Введение

What you need to know
Basic concepts, used in programming technology:

  1. Literals

  2. Variables

  3. Array variable

  4. Classes and objects

  5. Methods and functions

  6. Attributes

  7. Cycles

  8. Conditions

Web Applications
All smartphones include a surprisingly capable Web browser. Writing Web applications opens up the possibility of creating a single app that’s accessed over the Web via the browser. If you have expertise in creating Web applications, this method might be your best bet to create apps for multiple platforms, using one set of files. The languages of choice for Web apps are Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), and JavaScript. Knowing these languages can make creating Web apps easier.

1 The Computer of the Fu ture Is in Your Hand

This chapter covers what you need to know to start developing smartphone apps on the three major platform. It describes these platforms and some devices available for each platform and helps you decide which platform to target. The chapter also gives you an overview of available tool for each platform.

1 .1 What You Need to Know

Although it doesn't matter what programming language you've studied, you do need to be familiar with the following basic concepts:
• A literal is a piece of data stored in memory, such as a name, an address, or a phone number. It's immutable, meaning it can't 'be changed.
• A variable is a named pointer to data in your program that can change.
• An array is a collection of data, usually of the same type. You can access each memberof a collection by its index (place in the collection). In Java, Objective-C, and C#, arrays have anfixed, declared length, and all array members are of the same data type.
• A string is a collection of character data. Strings are immutable in Java, Objective-C, and C#, the programming languages used in this book.
Methods and functions are blocks of program code that run when they're called. They're the verbs of a program and represent what a program does.
Parameters are data valu es passed to other parts of a program, usually methods and
functions.
Properties are data associated "'th the objects of a program and can be compared with
adjectives. They describe what an object i" and does.
Loops are mechanism'i for repeating a set of programming instruction.a;: u ntil some
condition is met
Conditional statements are tests in a program that evaluate to true or fuLse.

In addition, you should know that a platform generally provides a software development kit (SOK) and an integrated development envirornment (IDE) to build apps. An SDK, which is the underlying engine of the IDE, includes all the platlOrm's libraries an app needs to access. It's more basic than an IDE because it doesn't usually have graphica l tools. The SD Ks used in this book, however, include extensive d ocumentation to help developers build apps. You should also be familiar with at least one I DE, such as NetBeans, Eclipse, PHPStorm, Xcode, and so forth, and be able to follow the standard development process in any IDE: write, compile, run, and debug.

1 .2 What Is a Smartphone?

You can think of a smartphone as a contemporary cellphone combined with a handheld computer you can use to develop apps that run on the underlying platform. A native app is one that's compiled for a specific platform's architecture. That's both a boon and a bane. On the one hand, you can create apps that are small, fast, and look like other apps on the device,
but you need different versions of the same app to support multiple platforms.

1 .3 History of the Smartphone

IBM and BellSouth introduced the first smartphone in 1994· as a joint effort: the IBM Simon. In addition to mobile phone capabilities, the Simon included a calendar, an address book, a world clock, a calculator, a note pad, e-mail, and games. It also sported a touch screen rather than physical buttons and offered 1 MB each of RAM and system memory. Memory could be expanded via an external memory card slot.

1 .4 Web applications

All smartphones include a surprisingly capable Web browser. Writing Web applications opens up the possibility of creating a single app that’s accessed over the Web via the browser. If you have expertise in creating Web applications, this method might be your best bet to create apps for multiple platforms, using one set of files. The languages of choice for Web apps are Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), and JavaScript. Knowing these languages can make creating Web apps easier.

2 Mobile Device Programming

Mobile devices have evolved dramatically over the past decade. They have grown from cellphones that could just make calls to full-fledged computers capable of doing nearly
everything a desktop computer can. With them, u sers can find information on a variety of levels, ranging from social networks to corpor:ate data and e-mail. Coupled with the evolution
of high-speed data networks, mobile devices a.re essential in an increasingly connected world.
In addition, mobile devices have become multifunctional. They represent the device convergence that began at the start of the 2ht century. No longer do u sers need to carry a phone, mlLsic player, and digital camera. Today's mobile devices can perform all the.o;e tasks and more wilth ease. Most mobile devices are also "location-aware" meaning they use the global positioning system (GPS) to determine where they are in the world. As a developer, you have access to all these features , then you create applications.

2 .1 How to choose a Platform?

When choosing a platform for your apps, ask yourself these four question:
• Who will use your apps? As with any application you develop, identifying the target audience helps determine on which platform you should build apps. Are you trying to reach a large markets Android and iPhone are the obvious choices. Are most of your users running Windndows on a desktop, or are you targeting an organization that uses a specific devices? Maybe Windows Phone 7 is your best bet. In short, you must identify who will use your app before you build it.
• ls there a future for the platfom? This question requires more thought. In the short term, all the platforms discussed here have a future. ln the long term, however, their prospects might look different. If you're trying to build a career developing mobile apps, you need to look at market share trends to help you determine which platform will have
staying power. lf you're creating apps for your personal use, you just need to know which phone you'll be using when your contract expires.
• What are your apps technical requirements? Each platform has its advantages and disadvantages. Are you considering a multitasking app. Need a lot of screen real estate or proprietary application programming interfaces (APIs)? What's most important is knowing which platforms support your te-chnical needs. 
• What are the platform's development tools? The available tools and your ability to use them influence how you develop apps. ls the platform vendor the only choice for writing your app. Are third-party tools available? What programming language is used to develop for the platform, and are you familiar with it. In short, if you can't work with the available
tools, your app won't get written.

2 .2 Platform languages and tools

Platform languages Tools
Google Android Java Google App Inventor, IBM Eclipse with plugins
Apple iOS Objective-C Apple Xcode, Interface Builder
Microsoft Windows Phone 7 C# Visual Studio 2010 for Windows Phone

 

3 Technologies survey

For Web:

For Google Android:

For Apple iOS:

For Windows Phone 7:

For PhoneGap:

3 .1 Integrated development environment

Integrated development environment (IDE) — software environment, used by programmers for software development (software).

Programming environment includes:

  • word processing application
  • compiler and/or interpreter
  • build automation capabilities
  • debug program

IDE is usually intended for several programing language, such as IntelliJ IDEA, NetBeans, Eclipse, Qt Creator, Geany, Embarcadero RAD Studio, Code::Blocks, Xcode или Microsoft Visual Studio but there is  IDE for a certain programing language such as, for example, Visual Basic, Delphi, DevC++.

Eclipse, NetBeans или IntelliJ IDEA? Выбираем IDE для Java-разработки

The key element  during application development is the  choice of the correct IDE, depending not only on the platform but also on the level of your educational background. Let's investigate the most famous of them.

3 .2 AndroidStudio

Android Studio, это форк (ну или просто производная) от Intellij IDEA, сделанная Google для разработки под android, там есть визуальный редактор интерфейса для android, используется библиотека - Android SDK для java. Eclipse может компилировать под android приложения, используя ту же библиотеку Android SDK, но там нет визуального редактора и это другая IDE, не базирующаяся на Intellij IDEA.

Определение и история

Android Studio — это интегрированная среда разработки (IDE) для работы с платформой Android, анонсированная 16 мая 2013 года на конференции Google I/O (выпущенной в 2009 году). Данный продукт призван снабдить разработчиков новыми инструментами для создания приложений, а также предоставить альтернативу Eclipse, являющейся в настоящее время наиболее популярной средой разработки.

IDE находилась в свободном доступе начиная с версии 0.1, опубликованной в мае 2013, а затем перешла в стадию бетатестирования, начиная с версии 0.8, которая была выпущена в июне 2014 года. Первая стабильная версия 1.0 была выпущена в декабре 2014 года, тогда же прекратилась поддержка плагина Android Development Tools (ADT) для Eclipse.

/*

Android Studio

Тип - Android IDE

Разработчик – Google

Написана на – Java

Операционная система - Кроссплатформенное ПО

Последняя версия – 2.2 (19 сентября 2016)

*/

Системные требования

 

Windows

OS X

Linux

Версия OS

Microsoft Windows 10/8/7/Vista/2003 (32 или 64-bit)

Mac® OS X® 10.8.5 или выше, до 10.9 (Mavericks)

GNOME или KDE

Оперативная память

2 ГБ (минимум), 8 ГБ (рекомендуется)

Свободное место на диске

500 МБ

Свободное место для Android SDK

1,5 ГБ (минимум)

Версия JDK

Java Development Kit 8

Разрешение экрана

1280 x 800 (минимум)

Дополнительно

-

Java Runtime Environment (JRE) 6

GNU C Library (glibc) 2.15 или выше

Преимущества и возможности

Android Studio, основанная на программном обеспечении IntelliJ IDEA от компании JetBrains, официальное средство разработки Android приложений. Данная среда разработки доступна для Windows, OS X и Linux.

При создании нового проекта в Android Studio, будет показана структура проекта со всеми файлами, содержащимися в каталоге SDK. Продукт также обладает новыми инструментами для упаковки и маркировки кода. Это позволит вам не потеряться в проекте, когда вы имеете дело с большим количеством кода. В программе также задействована функция перетаскивания, благодаря которой можно перемещать компоненты посредством пользовательского интерфейса.

Вдобавок ко всему, новая среда разработки обладает функцией Google Cloud Messaging, которая позволяет вам посылать данные с сервера на Android устройства через облако. Это отличный способ посылать push уведомления вашим приложениям.

Вы также сможете с помощью программы локализовать приложения. Это позволит вам программировать, и при этом сохранять контроль над приложением.

С помощью этой IDE процесс создания Android приложений значительно упрощается: теперь при желании родной .apk можно собрать примерно за 15–20 минут.

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

Что еще предлагает Android Studio?

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

Особенности

1) UI развития - изменения в файлах пользовательского интерфейса (макеты) динамически обновляются в режиме предварительного просмотра. Это может значительно ускорить процесс разработки.

2) Новый диалог завершения - который показывает иконки, файлы перевода и т.д. Это очень удобно. Например, если вы разрабатываете приложения на разных языках, вы можете увидеть все переводы выбранного слова в одном месте.

3) Из интеграции коробки с системами контроля версий - AS имеет по умолчанию смарт - плагин управления версиями (для SVN, GitHub и Mercurial), который управляет версиями файлов и их обновлениями с филиалами.

4) Глубокий анализ кода - если вы указываете на линии, это дает подробное объяснение исключения на основе аннотаций добавляемые. И вы можете также знать, какие константы разрешены для API.

 

Android Studio против Eclipse

Основные отличия:

1) Строительные инструменты

Android-студия использует быстрорастущую систему сборки Gradle. Он основывается на вершине концепций Apache Ant и Apache Maven, но он также вводит Groovy DSL (Domain-Specific Language), который позволяет сценарию сборки, открывает много возможностей автоматизации как загрузка беты .apk в TestFlight для тестирования.

Eclipse, с другой стороны, использует Apache Ant в качестве основной системы сборки, который очень надежный XML на основе построения системы.

Обе сред разработки имеют стандартный код Java авто завершения, но в случае Android Studio, Google сделала более глубокую поддержку конкретного кода и рефакторинга Android. Android Studio может реорганизовать свой код в тех местах, где это просто не возможно с помощью Eclipse, и ADT. Кроме того, на мой взгляд, завершение авто Java IntelliJ кажется более «умным» и предсказывает лучше, что я хочу сделать это, безусловно, есть улучшение в этой области над Eclipse.

2) Дизайн пользовательского интерфейса

Одним из основной точки продажи Google используется на рынок Android Studio, когда он вышел, был полностью переработан его дизайн инструмента пользовательского интерфейса. После работы с ним в течение некоторого времени, то становится ясно, что новый инструмент гораздо лучше, чем старый. Он буквально врезается его. Новый дизайн интерфейса тоже в Android Studio быстрее, реагирует на изменения быстрее и имеет больше вариантов настройки, что с Eclipse, вы должны были вручную установить в XML.

3) Организация проекта

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

свои собственные Gradle файлов сборки и объявить свою собственную

зависимость.

4) Производительность и стабильность

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

В этом плане пользователи, работающие на AS, чувствует себя быстрее и надежнее.

3 .3 Eclipse

Eclipse — свободная интегрированная среда разработки модульных кроссплатформенных приложений. Развивается и поддерживается Eclipse Foundation.

/*

Eclipse

Тип - Разработка ПО

Автор - Object Technology International

Разработчик - Eclipse Foundation

Написана на - Java

Интерфейс - Standard Widget Toolkit

ОС – Кроссплатформенное ПО

Языки интерфейса - Многоязычный

Аппаратная платформа - Java Virtual Machine

Последняя версия - 4.6 (Neon) (22 июня 2016)

*/

История

Первоначально Eclipse разрабатывалась фирмой IBM как преемник среды разработки IBM VisualAge, в качестве корпоративного стандарта IDE для разработки на разных языках под платформы IBM. Исходный код был полностью открыт и сделан доступным после того, как Eclipse был передан для дальнейшего развития независимому от IBM сообществу.

В Eclipse 3.0 (2003 год) были выбраны спецификации сервисной платформы OSGi, как архитектура среды исполнения. С версии 3.0 Eclipse перестал быть монолитной IDE, поддерживающей расширения, а сам стал набором расширений. В основе лежат фреймворк OSGi и SWT/JFace, на основе которых разработан следующий слой — RCP (Rich Client Platform, платформа для разработки полноценных клиентских приложений). Следующий слой — сам Eclipse, представляющий собой набор расширений RCP — редакторы, панели, перспективы, модуль CVS и модуль Java Development Tools (JDT).

/*

Платформа

Eclipse Project — собственно проект Eclipse, включает в себя:

- Eclipse Platform — каркас;

- Plugin Development Environment — инструмент расширения Eclipse-платформы посредством Eclipse-плагинов;

- Java Development Tools — инструмент разработки Java-программ и Eclipse-плагинов в частности.

Rich Client Platform — платформа расширенного клиента, минимальный набор плагинов для построения программы с графическим интерфейсом

*/

Описание

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

Множество расширений дополняет среду Eclipse диспетчерами для работы с БД, серверами приложений и др.

Эта среда с открытым исходным кодом, написанным преимущественно на Java. Тем не менее, её модульная архитектура позволяет использовать Eclipse и с другими языками. Проект Eclipse, инициированный IBM, появился в 2001 году. Им хотели заменить семейство сред разработки IBM Visual Age, основанных на Smalltalk. Ну а главной целью, о чем даже название говорит, было затмить Microsoft Visual Studio (eclipse по-английски означает затмение).

В силу бесплатности и высокого качества, Eclipse во многих организациях является корпоративным стандартом для разработки приложений. Eclipse написана на Java, потому является платформо-независимым продуктом, за исключением библиотеки SWT, которая разрабатывается для всех распространённых платформ.

Библиотека SWT используется вместо стандартной для Java библиотеки Swing. Она полностью опирается на нижележащую платформу (ОС), что обеспечивает быстроту и натуральный внешний вид пользовательского интерфейса, но иногда вызывает на разных платформах проблемы совместимости и устойчивости приложений.

Портативность Java помогает Eclipse быть кроссплатформенной средой: эта IDE работает на Linux, Mac OS X, Solaris и Windows.

Своей производительностью (или, как говорят некоторые доброжелатели, её отсутствию) Eclipse обязана JVM. Eclipse работает довольно медленно, поскольку упирается корнями в довольно старое «железо» и древние версии JVM. Даже сегодня она кажется медлительной, особенно если нацепить на неё много плагинов.

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

Независимо от сборки, проект Eclipse поддерживает модель контента, которая содержит информацию об иерархии типов, ссылок и объявлениях Java-элементов.

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

Поддержка плагинов

Экосистема плагинов Eclipse — это одновременно сильная сторона этой IDE и одна из главных её проблем. Именно из-за несовместимости плагинов порой падают целые сборки, и программистам приходится начинать работу сначала.

В настоящее время для Eclipse написано более 1700 плагинов, официальных и неофициальных, которые могут работать отлично, а могут из рук вон плохо. Плагины Eclipse, поддерживают более 100 языков программирования и почти 200 фреймворков для разработки приложений.

Редактирование, рефакторинг и отладка

Первый опыт работы с Eclipse, может привести в замешательство, и даже сбить с толку. Поначалу необходимо настроить Eclipse и привыкнуть к её концептуальной архитектуре рабочих пространств, ракурсов и видов. Всё это определяется плагинами, которые вы установили. Для серверной разработки на Java, вы, вероятно, будете использовать ракурсы Java, Java EE и Java browsing, вид, отображающий структуру пакета (Package Explorer), ракурс отладки, ракурс командной синхронизации веб-инструментов, ракурс разработки баз данных и ракурс отладки базы данных. На практике все обретает смысл, когда вы откроете нужные вам окна.

Eclipse практически всегда предлагает несколько способов решения той или иной задачи.

Специальный поиск Java позволяет найти объявления, ссылки и вхождения Java-пакетов, типов, методов, полей. Вы также можете использовать быстрый доступ к поиску и предпросмотр.

Распространенные паттерны кода можно сгенерировать из шаблонов кода. Рефакторинг Java в Eclipse, поддерживает 23 операции, начиная от общепринятых операций по переименованию и заканчивая менее очевидными.

Eclipse, поддерживает отладку как локально, так и удаленно, при условии, что вы используете JVM, которая поддерживает удаленную отладку. Отладка довольно стандартна: вы определяете контрольные точки, а затем просматриваете переменные в закладке отладки. Конечно, можно пошагово выполнять свой код и вычислять выражения.

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

3 .4 Device emulation

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

  • Эмуляторы
  • Облачные платформы устройств
  • Автоматизированное воспроизведение скриптовых тестов
  • Нагрузочное тестирование
  • Манкитестинг
  • Сборщики статистики

Сперва приложение тестируется в среде разработки с использованием эмулятора. После этого приложение тестируется на устройстве. Эмуляторы являются простым способом тестировать приложение на мобильном телефоне, не используя его физически. Кроме этого, эмуляторы используются в случаях, когда у разработчиков нет возможности проверить работоспособность приложения на той или иной платформе (например, у разработчика отсутствует устройство на IOS, Android или Windows Phone). Ниже представлен список доступных инструментов для тестирования приложений среди самых популярных мобильных операционных систем:

  • Google Android Emulator

Android Эмулятор запускается на Windows как отдельное приложение без необходимости полностью загружать и устанавливать Android SDK.

  • Официальный Android SDK Emulator

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

  • MobiOne

MobiOne Developer — это mobile Web IDE для Windows, помогающее разработчику программировать, тестировать, отлаживать, упаковывать и внедрять мобильные веб-приложения на устройства, такие, как iPhone, BlackBerry, устройства на Android и Palm Pre.

  • TestiPhone

Основанный на веб-браузере симулятор для быстрого тестирования веб-приложений для iPhone. Работает с использованием Internet Explorer 7, Firefox 2 и Safari 3.

  • iPhoney

Предоставляет точную среду веб-браузера, разработана Safari. Может быть использована для разработки веб-сайтов для iPhone. Не является эмулятором iPhone. iPhoney запускается только на Mac OS X 10.4.7 и выше.

  • BlackBerry Simulator

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

  • Genymotion Android Emulator

Эмулятор Android, включающий в себя готовые и настроенные образы Android (x86 с аппаратным ускорением OpenGL).

4 Object-Oriented Programming

Object-oriented programs are built by creating objects that interact with each other. They can contain multiple objects of different types, many objects of the same type, or any combination. Each object possesses its own data, and data access for each type of object is the same. You grant access to data by writing special methods stored in the object.

The fundamental construct of OOP  is the class.

Inheritance,

encapsulation,

polymorphism

4 .1 Encapsulation

ln object-oriented terrns encapsulation is a combination of bundling data and  behavior into discrete  units and protecting them from outside programs. 

4 .2 Inheritance

Inheritance, speeifically class inheritance, is u sually considered a prerequisite for any OOP language.

4 .3 Polymorphism

Polymorphism literally means "many shapes."

5 Design Templates for Mobile Devices

Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения — повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

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

«Низкоуровневые» шаблоны, учитывающие специфику конкретного языка программирования, называются идиомами. Это хорошие решения проектирования, характерные для конкретного языка или программной платформы, и потому не универсальные.

На наивысшем уровне существуют архитектурные шаблоны, они охватывают собой архитектуру всей программной системы.

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

Объектно-ориентированные языки

Java, Objective-C, and C# are derivatives of the C programming language. C is a procedural language, meaning programs run as a series of commands, one after the other. Sometimes code is grouped into functions and subroutines, but for the most part, execution is linear.

In addition, in C programs it’s common for all functions and code to have access to the program’s data. That is, the data in a C program is global—it can be accessed and modified at any point.

That’s usually fine for small and even medium-sized programs. In large programs, however, allowing data to be modified from anywhere is dangerous because potential bugs can have wide-ranging effects.

Unlike procedural programs, OOP programs are data centered. You design the objects in your OOP program to hold data and then determine how that data is accessed inside the object. This close control of data access results in fewer bugs and more code reuse.

Object-oriented programs are built by creating objects that interact with each other. They can contain multiple objects of different types, many objects of the same type, or any combination. Each object possesses its own data, and data access for each type of object is the same. You grant access to data by writing special methods stored in the object.

The fundamental construct of OOP is the class, which can be thought of as a template for creating objects.Figure shows a Unified Modeling Language (UML) diagram for a class used to create Rectangle objects.


In UML class diagrams, the class name is placed at the top, and sections are created for data members and member methods. Figure 3-1 is used to define the Rectangle class and specify that each Rectangle object created has the data members length and width. These data members have been defined as the double data type (that is, double-precision numbers, or decimal numbers).
In addition, each Rectangle object knows how to calculate its own area and perimeter, using the member methods shown in the UML diagram: getArea() and getPerimeter(). These methods return values that are also defined as doubles.

A Rectangle class written in Java
public class Rectangle{
double length;
double width;
public double getArea(){
return length * width;
}
public double getPerimeter(){
return 2 * (length+width);
}
}

5 .1 Model-View-Controller

The Model-View-Controller (MVC) design pattern represents a structure in which each program task is in a different tier,  as shown in Figure

6 Development for mobile browsers

Web applications are a collection of resources on a publicly accessible server that provide some sort of functionality. Users access them by using a Web browser, which is responsible for downloading any code needed for the Web application, interpreting the code, and displaying the results to users. The standard types of files you create when building a Web application are Hypertext Markup Language (HTML), Cascading Style Sheets (CSS), and JavaScript files. Taken together, these types of files enable you to build powerful Web applications.
Generally, smartphones are capable of rendering pages intended for the desktop with no problems, and the devices covered in this book have excellent browsers that can render Extensible HTML (XHTML) with CSS and run JavaScript code. Both iOS and Android devices use the WebKit browser engine. WebKit is an open-source rendering engine developed by Apple as a derivative of the Linux Konqueror browser’s KHTML engine.
Windows Phone 7 devices use a version of Internet Explorer (IE), Microsoft’s Web browser. Almost any application you develop on the Web for the desktop can be rendered on a smartphone browser, with the exception of Adobe Flash content. For a number of reasons, including security and battery drain, Apple has rejected including support for any Flash content on iOS devices; instead, it targets the newest HTML 5 specification. Both Android and Windows Phone 7 support versions of Flash.

 

7 Apple iOS

Objective-C is the programming language used to develop in both Mac OS X and iOS. It’s
a superset of ANSI C, so it includes the C language as well as other libraries and tools,
much as C++ extends the C language. It’s also an object-oriented language that makes use
of inheritance, polymorphism, and encapsulation—the three pillars of object-oriented
programming.
So why do you need a primer? You might not, but Objective-C looks so much different from the
other languages used in this book that it warrants a short discussion, at least. To begin, Objective-C
uses some different metaphors than most other languages. So, for example, in Objective-C you
send messages to objects rather than call methods on them. Although each Objective-C class
includes an interface in a header file, an Objective-C interface is different from a Java or
C# interface. Objective-C interfaces provide the API for a single class, whereas Java and
C# interfaces can be implemented by many classes. You learned in Chapter 3 that
Objective-C classes are said to conform to protocols rather than implement interfaces
as do Java and C# classes.

 

7 .1 The Basics of Objective-C

Язык был придуман Брэдом Коксом (Brad Cox) в начале 80-х годов прошлого века. Целью Кокса было создание языка, поддерживающего концепцию software IC. Под этой концепцией понимается возможность собирать программы из готовых компонент (объектов), подобно тому как сложные электронные устройства могут быть легко собраны из набора готовых интегральных микросхем (IC, integrated curcuits). При этом такой язык должен быть достаточно простым и основанным на языке С, чтобы облегчить переход разработчиков на него.

Objectiv-C является именно расширением языка С — в язык С просто добавлены новые возможности для объектно-ориентированного программирования. При этом любая программа на С является программой и на Objective-C (для языка С++ это не верно).

Файлы модулей на Objective-C имеют расширение “.m” (если использовалась смесь С++ и Objective-С, то расширение “.mm”). Заголовочные файлы – “.h”. Все, создаваемые в Objective-С объекты классов должны размещатся в динамической памяти. Поэтому особое значение приобретает тип id, который является указателем на объект любого класс.

Синтаксис языка

В языке Objective-C для обозначения объектов используется специальный тип id. Переменная типа id фактически является указателем на произвольный объект. Для обозначения нулевого указателя на объект используется константа nil. Кстати про id: движок игры Doom разрабатывался на рабочих станциях Next, так что может есть связь между типом id и названием idSoftware.

При этом вместо id можно использовать и более привычное обозначение с явным указанием класса. В частности последнее позволяет компилятору осуществлять некоторую проверку поддержки сообщения объектами — если компилятор из типа переменной не может сделать вывод о поддержке объектом данного сообщения, то он выдаст предупреждение (а не ошибку !). Тем самым язык поддерживает проверку типов, но в нестрогой форме (т.е. найденные несоответствия возвращаются как предупреждения, а не ошибки).

Для посылки сообщений используется следующий синтаксис:
[receiver message];

Сообщение может также содержать параметры:
[myRect setOrigin:30.0 :50.0];
В этом примере именем метода (сообщения) является setOrigin::. Обратите внимание, что каждому передаваемому аргументу соответствует ровно одно двоеточие. При этом в приведенном примере первый аргумент имеет метку (текст перед двоеточием), а второй — нет.

Язык Objective-C позволяет снабжать метками каждый аргумент, что заметно повышает читаемость кода и снижает вероятность передачи неправильного параметра.
[myRect setWidth:10.0 height:20.0];
В этом примере в качестве имени сообщения выступает setWidth:height:.

Также поддерживается возможность передачи произвольного количества аргументов в сообщении:
[myObject makeGroup: obj1, obj2, obj3, obj4, nil];

Как и функции, сообщения могут возвращать значения, при этом в отличии от языка С, типом возвращаемым по умолчанию значения является id.
float area = [myRect area];

Результат одного сообщения можно сразу же использовать в другом сообщении:
[myRect setColor:[otherRect color]];

Как уже говорилось, в Objective-C классы сами являются объектами. Основной задачей таких объектов (называемых class objects) является создание экземпляров данного класса. При этом само имя класса играет двойную роль — с одной стороны оно выступает как тип данных (т.е. он может быть использован для описания указателей на объекты данного класса). А с другой стороны имя класса может выступать в качестве объекта, которому посылается сообщение ( в сообщениях имя класса может принимать участие только как receiver). В языке Objective-C нет встроенного типа для булевских величин, поэтому обычно такой тип вводится искусственно. Далее я буду для логических величин использовать тип BOOL с возможными значениями YES и NO(ИМХО более понятней, но не так “политкорректно” как true/false).

Создание новых классов

Все новые директивы компилятору в языке Objective-C начинаются с символа @. Как и в С++ описание класса и его реализация разделены (обычно описание помещается в заголовочные файлы с расширением h, а реализации — в файлы с расширением m).
Ниже приводится общая структура описания нового класса:
@interface ClassName: SuperClass
{
instance variable declarations
}
method declarations
end


В версии runtime от Apple все классы имеют общего предка — класс NSObject, содержащий целый ряд важных методов. Описание переменных ничем не отличается от описания переменных в структурах в языке С:
@interface Rect: NSObject
{
float width;
float height;
BOOL isFilled;
NSColor * color;
}
end


Каждое описание начинается со знака плюс или минус. Знак плюс обозначает, что данный метод является методом класса (т.е. его можно посылать только class object'у, а не экземплярам данного класса). Фактически методы класса являются аналогами статических методов в классах в языке С++. Знак минус служит для обозначения методов объектов — экземпляров данного класса. Обратите внимание, что в Objective-C все методы являются виртуальными, т.е. могут быть переопределены.

Ниже приводятся описания возможных методов для класса Rect.
@interface Rect: NSObject
{
float x, y;
float width;
float height;
BOOL isFilled;
NSColor * color;
}
+ newRect;
— (void) display;
— (float) width;
— (float) height;
— (float) area;
— (void) setWidth: (float) theWidth;
— (void) setHeight: (float) theHeight;
— (void) setX: (float) theX y: (float) theY;
end


Обратите внимание, что имя метода может совпадать с именем instance-переменной данного класса (например, width и heigh).
Тип возвращаемого методом значения указывается в круглых скобках сразу же после знака плюс или минус (но перед названием метода). Если тип не указан, то считается, что возвращается значение типа id. Далее идет имя метода, где после каждого двоеточия задается тип аргумента (в круглых скобках) и сам аргумент. Язык Objective-C позволяет для аргументов метода задавать также один из следующих описателей — oneway, in, out, inout, bycopy и byref. Данные описатели служат для задания направления передачи данных и способа передачи.

Метод, принимающий произвольное количество параметров, может быть описан следующим образом:
— makeGroup: (id) object, ...;

Для подключения заголовочного файла в Objective-C вместо директивы #include используется директива #import, полностью аналогичная #include, но гарантирующая что данных файл будет подключен всего один раз.

Реализация методов класса выглядит следующим образом:
#import «ClassName.h»
@implmentation ClassName
method implementations
end


Ниже приводится пример реализации методов класса Rect, описанного ранее.
#import «Rect.h»

@implmentation Rect

+ newRect {
Rect * rect = [[Rect alloc] init];
[rect setWidth: 1.0f];
[rect setHeight: 1.0f];
[rect setX: 0.0f y: 0.0f];
}
— (float) width { return width; }
— (float) height { return height; }
— (float) area { return [self width] * [self height]; }
— (void) setWidth: (float) theWidth { width = theWidth; }
— (void) setHeight: (float) theHeight { height = theHeight; }
— (void) setX: (float) theX y: (float) theY {
x = theX;
y = theY;
}
end


Как видно из примера выше, в методах доступны все instance-переменные. Однако, как и в С++, есть возможность управлять видимостью переменных (видимостью методов управлять нельзя) при помощи директив private, protected и public (действующих полностью аналогично языку С++).

Как работает механизм сообщений

Компилятор переводит каждую посылку сообщения, т.е. конструкцию вида [object msg] в вызов функции objc_msgSend.

Эта функция в качестве своего первого параметра принимает указатель на объект-получатель сообщения, в качестве второго параметра выступает т.н. селектор, служащий для идентификации посылаемого сообщения. Если в сообщении присутствуют аргументы, то они также передаются objc_msgSend как третий, четвертый и т.д. параметры. Далее происходит поиск подходящей функции среди функций данного класса, если такой не найдено, то среди функций родительского класса, если и там не найдено, то среди функций родительского класса родительского класса( :-) ) и т.д. Если метод (т.е. соответствующая ему функция) находится, то осуществляется его вызов с передачей всех необходимых аргументов.

В противном случае объекту дается последний шанс обработать сообщение перед вызовом исключения — селектор сообщения вместе с параметрами «заворачивается» в специальный объект типа NSInvocation и объекту посылается сообщение forwardInvocation:, где в качестве параметра выступает объект класса NSInvocation.

Если объект поддерживает forwardInvocation:, то он может либо сам обработать посылаемое сообщение, либо переслать другому объекту для обработки:
— (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ( [someOtherObject respondsToSelector: [anInvocation selector]] )
[anInvocation invokeWithTarget: someOtherObject];
else

}

Создание и уничтожение объектов

В самом языке Objective-C нет специальных команд для создания и уничтожения объектов (подобных new и delete). Эта задача ложится на runtime-библиотеку и реализуется при помощи механизма посылки сообщений.
Создание нового объекта разбивается на два шага — выделение памяти и инициализация объекта. Первый шаг реализуется методом класса alloc (реализованном в классе NSObject), который выделяет необходимое количество памяти (данный метод используется для выделения памяти не только для объектов класса NSObject, но и любого унаследованного от него класса). При этом выделяемая память обнуляется и в атрибут isa записывается указатель на class object соответствующего класса.

Обратите внимание, что сообщение alloc посылается class object-у требуемого класса и это сообщение возвращает указатель на выделенную под объект память.

Собственно сама инициализация объекта (т.е. установка значений его instance-переменных, выделение дополнительных ресурсов и т.п.) осуществляется другими методами, по традиции имена этих методов начинаются с init. Обычно такое сообщение посылается сразу же после сообщение alloc, по адресу, возвращенному этим сообщением.

id anObject = [[Rectangle alloc] init];

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

Обратите внимание, что метод(ы) init является обычным методом, ничем не выделяющимся среди остальных (в отличии от С++, где конструктор — это особый метод, у которого например нельзя взять адрес). Поэтому при создании нового класса и метода init вызов переопределенного метода init (при помощи [super init]) должен быть произведен явно в самом начале метода.

Mac OS X (как и NextStep) для управления временем жизни объектов используют reference counting — каждый объект содержит внутри себя некоторый счетчик, при создании устанавливаемый в единицу.

Посылка объекту сообщения retain увеличивает значение этого счетчика на единицу (так все контейнерные классы библиотеки Foundation при помещении в них объекта, посылают ему сообщение retain). Установившейся практикой является посылка объекту сообщения retain всеми, заинтересованными в нем сторонами (объектами), т.е. если вы запоминаете ссылку на объект, то следует послать ему сообщение retain.

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

Перед уничтожением объекта ему посылается сообщение dealloc, позволяющее объекту произвести свою деинициализацию. При этом это также является обычным сообщением и в нем Вы явно должны в конце вызвать унаследованную реализацию через [super dealloc].

— (void) dealloc
{
...
[super dealloc];
}

Objective-C 2.0

На WDC2006 Apple представила новую версию языка — 2.0. Среди нововведений были отмечены сборка мусора, быстрая энумерация, свойства в классах, 64-битная поддержка и многое другое. Следует отметить, что эти нововведения доступны только для Leopard.

Сборка мусора

Objective-C 2.0 позволяет производить автоматическую сборку мусора, правда это опционально.

Свойства

Ранее для изменения и чтения instance variables необходимо было писать методы возврата и задания значения(т.н. getters and setters), теперь можно писать так:

@interface Person: NSObject {
}
@property(readonly) NSString *name;
@property(readonly) int age;
-(id)initWithName:(NSString)name age:(int)age;
end


Получить значение свойства можно так:
NSString *name = aPerson.name;

Быстрая энумерация

Теперь добавлен аналог оператора foreach:
for (Person *p in thePeople) NSLog(@"%@ is %i years old.", [p getName], [p getAge]);

7 .2 xCode

При разработке мобильных iOS приложений в среде XCode запуск и тестирование происходит на симуляторе. Однако каждый профессиональный разработчик вам скажет, что окончательную отладку нужно производить на реальных устройствах. Причем лучше на нескольких различных устройствах. На iPhone 5, на iPhone 6, на различных версиях iPad и iPod. Однако для этого политика компании Apple заставляет приобрести аккаунт разработчика. Он стоит $99 и для начальных шагов в программировании не всегда оправданы эти затраты. И вот наконец, просьбы разработчиков были услышаны и появился способ легального запуска своих приложений на реальных устройствах и этот способ абсолютно бесплатный.

Были различные варианты решения этой проблемы от установки на устройство Jailbreak до недорогого варианта добавления UDID устройства к реально существующему аккаунту разработчика. (Последний способ стоит 300 руб).  Но как написано выше с выходом XCode 7 эта проблема была решена.

Подключение устройства

Подключите iPhone, Ipod Touch, или IPad к вашему Mac с помощью кабеля USB кабеля. В меню Xcode зайдите Window → Devices, чтобы открыть список устройств. Окно выглядит следующим образом (я использую iPad Air):

В левой панели окна Xcode находится список устройств, которые могут быть использованы для запуска разработанных приложений. Нажмите на изображение вашего устройства, чтобы выбрать его. Если устройство используется впервые вместе с Xcode, вы увидите сообщение  что-то вроде, ““iPad is not paired with your computer.

Для того чтобы связать устройство с Xcode вам нужно разблокировать устройство (Slide to unlock). После разблокировки, на экране устройства появится сообщение с просьбой доверять этому компьютеру. Нажмите “Разрешить” чтобы продолжить. Теперь Xcode выведет страницу, на которой напишет что позволяет использовать устройство для тестирования.

Дайте ему несколько минут – если процесс занимает слишком много времени, возможно потребуется отсоединить устройство и подключить его снова. Есть вероятность, что выскочит сообщение об ошибке:  “An error was encountered while enabling development on this device.” Потребуется отключение устройства и перезагрузка его. Также перезапустите Xcode, прежде чем вы снова подключите устройство.

Так должно выглядеть окно с сопряженным устройством:

Настройка AppleID

Теперь, когда устройство сопряжено с компьютером, нужно связать ваш AppleID с Xcode. Можно использовать тот же идентификатор AppleID, что вы уже используете с Itunes  и вашим устройством, однако, если вы разрабатываете корпоративное iOS приложение, то можете создать новый AppleID, чтобы разделить процессы разработки. Конечно, если у вас уже есть оплаченный аккаунт разработчика вы должны использовать именно его.

Откройте  меню  Xcode -> Preferences  -> Accounts

Нажмите кнопку “+”  внизу и выберите “Add Apple ID“. Xcode попросит логин и пароль от AppleID. Введите их и нажмите Add. Xcode проверит ваши данные и добавит их к списку аккаунтов.

Далее необходимо указать Xcode использовать эту учетную запись при создании вашего приложения.  Перейдите к экрану настроек проекта и на вкладке General нажмите на Team, чтобы выбрать ваш  Apple ID.

Компилирование и запуск

Нажмите Run, чтобы скомпилировать и запустить приложение. В этот момент вы можете получить всплывающее окно с вопросом “codesign wants to sign using key … in your keychain”. Если вышло это сообщение, нажмите Always Allow – т.е. разрешать всегда. Это сообщение говорит о том,  что Xcode пытается использовать новый сертификат разработки, который вы только что создали, но просит дать ему разрешение для этого.

8 Microsoft Windows Phone 7

Windows Phone 7 is the newcomer to the smartphone playing field. Although Microsoft has
been in the smartphone game for a while, earlier entries were attempts to squeeze desktop
features of Windows into small devices and didn’t pay off. Windows Phone 7, however, is a
new OS designed specifically for smartphones; it features tight integration with Microsoft
Office and Outlook.
Windows Phone 7 uses C#, the most advanced programming language of all the platforms
discussed in this book. If Objective-C is a step backward from the industry-standard Java, C#
is, in many ways, a look into the future. It has incorporated the best of Java and addressed
many shortfalls.
Windows Phone 7 also uses Microsoft Visual Studio 2010 as its IDE, which is easy to use and
powerful. Microsoft helps developers create useful apps because it recognized long ago that
users adopt platforms because of the apps they run. As you’ve learned, Apple has used this
concept to dominate the small-device market.
Windows Phone 7 apps come in two types: Silverlight and XNA Games. You can build
both types of apps with the Windows Phone 7 SDK and Visual Studio 2010 Express for
Windows Phone 7, but this book covers only Silverlight apps. Silverlight is a
development platform for creating interactive apps for the Web, desktops, and mobile
devices. This free plug-in powered by the .NET Framework is compatible across several
browsers, devices, and OSs. The Silverlight for Windows Phone version supports core
Silverlight features and adds capabilities specific to Windows Phone 7. Silverlight
features that don’t make sense for small devices have been omitted. Its features include
the following:

9 Android

Архитектура Andorid

9 .1 Java for Android

Язык Java активно используется для создания мобильных приложений под операционную систему Android. При этом программы компилируются в нестандартный байт-код, для использования их виртуальной машиной Dalvik (начиная с Android 5.0 Lollipop виртуальная машина заменена на ART). Для такой компиляции используется дополнительный инструмент, а именно Software Development Kit, разработанный компанией Google.

Разработку приложений можно вести в среде Android Studio, NetBeans, в среде Eclipse, используя при этом плагин Android Development Tools (ADT) или в IntelliJ IDEA. Версия JDK при этом должна быть 5.0 или выше.

Программисты пишущие под android работают в среде разработки Android Studio, которую презентовала компания Google в 2013 году. А 8 декабря 2014 года Android Studio признана компанией Google официальной средой разработки под ОС Android.

9 .2 Documentation of Android

Адрес официальной документации - http://develop.android.com

Документация делится на три чатси: проектирование (Design), разработка (Develop) и распространение (Distribute)

Другие полезные ссылки: https://www.android-recovery.net

Ресурсы приложений Android с открытым исходным кодом www.En.wikipedia.org/wiki/List_of_open_source_Android_applications

Примеры приложений Google для платформы Android wwwode.google.com/p/apps-for-android/

Примеры приложений, демонстрирующих различные свойства платформы Android. www.developer.android.com/resources/browser.html?tag=sample

Философия и цели разработчиков платформы www.Android.source.android.com/about/philosophy.html

www.developer.android.com/guide/developing/tools/emulator.htm

9 .3 Emulator

Встроенный

Для разработки android-приложений, кроме самой среды разработки AndroidStudio нам также потребуется встроенный в IDE эмулятор. android.

Эмитация жестов Android на эмуляторе. Эмулятор Android поддерживает стандартные жесты android.

Функции Andorid, которые не поддерживаются эмулятором:

• Выполнение и получение реальных телефонных звонков (эмулятор может лишь имитировать звонки).

• USB-подключения.

• Камера и видеосъемка.

• Наушники, подключаемые к устройству.

• Идентификация подключенного состояния телефона.

• Идентификация заряда батареи и состояние, в котором заряжается батарея.

• Определение вставки/извлечения SD-карты.

• Bluetooth.

• Коммуникации ближнего поля.

• Датчики (акселерометр, барометр, компас, датчик освещенности, датчик приближения).

Эмулятор Android, включенный в состав Android SDK, позволяет создать имитационную среду для запуска приложений Android под управлением Windows, Mac OS X либо Linux. Но сперва его необходимо настроить.

Tools → Android → AVD Manager.

Когда на экране появится окно AVD Manager, щелкаем на кнопке Create Virtual Device в левой части этого экрана. Выбираем устройство Nexus 5

Если в ОС windows выскочило предупреждение, то необходимо установить драйвер adb (Android Debug Bridge). Загрузить его можно с сайта производителя.

Альтернативный

Genymotion — альтернативный эмулятор Android созданный независимыми разработчиками. http://Genymotion.com

Физическое устройство

Конечная проверка приложения производится после загрузки приложения на android-приложения. Однако существует два способа тестирования приложения на физическом устройстве.

  • Без создания apk-файла.

    На android-устройстве должна быть включена отладка USB. И устройство должно быть соединено по USB-кабелю с комьютером, или другим устройством на котором ведется разработка android-приложения.

  • Через создание apk-файл.

В системе построения приложений используется программа Gradle. Откомпилированные ресурсы и классы Java упаковываются в файл с расширением .apk, который является установочным файлом для android-приложений.

9 .4 Manifest

Входной точкой в любое android-приложение является файл манифеста.

Файл AndroidManifest.xml.

xml version="1.0" encoding="utf-8"?>
package="by.colony.mikhalkevich.android">

android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">



intent-filter>
activity>
application>

manifest>

Файл AndroidManifest.xml, который также называется манифестом, включает информацию, которая применяется для выполнения приложения на платформе Android и корректной фильтрации на Google Play. Благодаря этому можно скрывать приложение от пользователей, просматривающих Google Play и использующих устройства, несовместимые с этим приложением. Например, пользователи устройств без встроенной камеры не смогут получить доступ к приложениям, требующим камеру (это требование указывается в манифесте приложения). Манифест автоматически создается модулем ADT Plugin для Eclipse или AndroidStudio, но перед загрузкой приложения на Google Play потребуется вручную добавить в манифест необходимую информацию. Манифест, представляющий собой XML-файл, можно редактировать вручную либо с помощью программы Android Manifest Editor.

9 .5 Activity

Основа любого android-приложение — взаимодействие активностей.

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

Еще активность можно сравнить со страницами разных сайтов, открываемых в браузере по ссылке.

Обычно активности занимают весь экран. Но это не обязательно. Можно создавать полупрозрачные активности и активности ввиде плавающих окон.

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

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

Рассмотрим содержимое файла главной активности: контроллер MainActivity из папки Java.

Оператор package указывает на то, что класс в этом файле является частью пакета package by.colony.mikhalkevich. А с помощью оператора import мы можем импортировать различные интерфейсы и классы в приложение.

Активность представлена экземпляром класса Activity — класса из Android SDK. Данный класс отвечает за взаимодействие пользователя с информацией на экране.

Главная активность приложения. Листинг

package by.colony.mikhalkevich.hello;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

Активность имеет жизненный цикл. Начало, когда создается экземпляр активности, промежуточное состояние, и конец, когда экземпляр класса уничтожается. В момент создания активности вызывается метод onCreate().

Активность может находиться в трех состояниях:

  • активная (active, running) – активность находится на переднем плане экрана. Пользователь может взаимодействовать с активным окном.

  • приостановленная (paused) – активность потеряла фокус, но всё еще видна пользователю.

  • остановленная (stopped).

Методы жизненного цикла приложения:

  • protected void onCreate() вызывается при создании активности

  • protected void onStart() вызывается в момент старта активности. Активность еще не видна пользователю, но скоро будет видна.

  • protected void onStop() вызывается в момент остановки активности.

  • protected void onRestart() вызывается после того, как остановленная активность запускается снова.

  • protected void onPause() вызывается в момент, когда пользователь переходит к новой активности, не выходя из текущей.

  • protected void onDestroy() вызывается по окончании работы активности.

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

Создать новую активность мы можем двумя способами: в ручную, либо с помощью команды File -> new ->activity -> (выбор нужной активности).

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

Запись в файле манифеста в приложении с двумя активностями. Листинг 1.

<activity android:name=".Main2Activity">activity>

Также автоматически создается класс активности и шаблон, вызываемый классом.

Для вызова активности из метода воспользуемся классом Intent.

Вызов активности из метода. Листинг 1.

import android.content.Intent;

public void Back(View view) {
 //Создаем обратный переход по нажатию на кнопку "Назад":
 Intent intent=new Intent(Second.this,MainActivity.class);
 startActivity(intent);
}

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

Рассмотрим передачу данных между активностями на примере. Для этого создадим две активности: MainActivity и Second.

MainActivity. Листинг 1.

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import static home.study.R.id.b1;
 public class MainActivity extends Activity {
 //Объявляем объекты, которые будем использовать:
 private EditText mName;
 private EditText mFam;
 private Button mGo;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 //Привязываем объявленные объекты к созданным нами элементам в activity_main.xml:
 mName=(EditText)findViewById(R.id.et1);
 mFam=(EditText)findViewById(R.id.et2);
 mGo=(Button)findViewById(b1);
 }
 //Обрабатываем нажатие кнопки "Передать"
 public void Send(View view) {
 switch (view.getId()) {
 case R.id.b1:
 
 //Создаем переход:
 Intent intent=new Intent(MainActivity.this,Second.class);
 //Создаем данные для передачи:
 intent.putExtra("name", mName.getText().toString());
 intent.putExtra("fam", mFam.getText().toString());
 //Запускаем переход:

MainActivity вызывает шаблон activity_main, в котором два элемента формы для ввода текста и кнопка, по нажатию на которую вызывается метод Send первой активности.

Шаблон activity_main. Листинг 1.

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_height="fill_parent"
 android:layout_width="fill_parent"
 android:orientation="vertical">
 <EditText
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/et1"
 android:hint="Введите имя"/>
 <EditText
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/et2"
 android:hint="Введите фамилию"/>
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b1"
 android:text="Передать"
 android:layout_gravity="center"
 android:onClick="Send"/>
LinearLayout>

Переходим к редактированию второй активности.

Активность Second. Листинг 1.

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 public class Second extends Activity {
 //Объявляем объекты, которые будем использовать:
 private TextView mT1;
 private TextView mT2;
 private Button mBack;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.second);
 //Привязываем объявленные объекты к созданным нами элементам в second.xml:
 mT1=(TextView)findViewById(R.id.tv1);
 mT2=(TextView)findViewById(R.id.tv2);
 mBack=(Button)findViewById(R.id.b2);
 
 //Получаем текстовые данные с первого Activity:
 String Name = getIntent().getStringExtra("name");
 String Fam = getIntent().getStringExtra("fam");
 
 //Присваиваем созданным элементам TextView значение полученных текстовых данных:
 mT1.setText(mT1.getText().toString()+ "" + Name);
 mT2.setText(mT2.getText().toString()+ "" + Fam);
 }
 
 public void Back(View view) {
 //Создаем обратный переход по нажатию на кнопку "Назад":
 Intent intent=new Intent(Second.this,MainActivity.class);
 startActivity(intent);
 }
}

Шаблон второй активности.

Шаблон активности Second. Листинг 1.

xml version="1.0" encoding="utf?8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tv1"
 android:text="Имя: "
 android:textSize="18dp"/>
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tv2"
 android:text="Фамилия: "
 android:textSize="18dp"/>
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/b2"
 android:text="Назад"
 android:layout_gravity="center"
 android:onClick="Back"/>
LinearLayout>

Видео по теме: https://www.youtube.com/watch?v=dsuc29P7H68

9 .6 Resource

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

Ресурсы проекта находятся в подкаталоке app/res. Строковые файлы, содержащие строковые ресурсы находятся в папке res/values/. Файлы шаблонов находятся в папке res/layout/.

Каждый проект включает в себя файл strings.xml, который находится по пути app/res/values. Представление получает данные как раз из этого файла.

Файл strings.xml


<string name="app_name">Каталогstring>
Каталогstring>
Выберете из спискаstring>
<string-array name="category">
Поделкиitem>
Сайтыitem>
Программыitem>
string-array>
resources>

Для обращения к ресурсам используется идентификатор ресурса. В файле активности ссылаться на ресурсы можно через класс R.

9 .7 Widgets

Экнш onCreate запускает на выполнение представление из файла res/layout/activity_main.xml. Это главный файл представления, и в нем определяется относительное расположение компонентов.

За расположение элементов на экране отвечают виджеты и атрибуты виджетов.

Сперва рассмотрим основные виды Layout, т. к. эти виджеты являются корневыми:

LinearLayout. Отображает view-элементы ввдите одной строки, если он Horizontal и ввиде одного столбца, если он Vertical.

TableLayout. Отображает элементы ввиде таблицы по строкам и столбцам.

RelativeLayout. Для каждого элемента настраивается его положение относительно других элементов.

AbsoluteLayout. Для каждого элемента настраивается его явная позиция в системе координат по x и y.

FrameLayout.

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

View-элементы

Создать любой виджет можно и не зная его кода. Для этого нужно кликнуть по его названию в панели виджетов.

Чтобы сгенерировать идентификатор ресурса для виджета, необходимо добавить для него атрибут adnroid:id.

Добавление идентификатора ресурса для виджета. Листинг 1.

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/myid"
android:id="@+id/textView" />

Обратите внимание на знак +, присутствующий в значениях android:id. Это значит, что мы создаем идентификаторы. В атрибуте android:text мы ссылаемся на уже созданный ранее в строковом файле идентификатор с именем myid.

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

public View findViewById(int id);

Метод получает идентификатор ресурса виджета и возвращает объект View.

Обращение к виджетам в классе активности. Листинг 1.

public class MainActivity extends AppCompatActivity {

private Buttom mTrueButtom;

@override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

mTrueButtom = (Buttom) findViewById(R.id.buttom);

setContent(R.layout.activity_main);

}

}

Layout_width и Layout_height – для определения ширины и высоты. Используются следующие единицы измерения:

dp (density-independent pixels) – абстрактная единица измерения, позволяющая приложениям выглядеть одинаково на различных экранах и разрешениях.

sp (scale-independent pixels) – то же, что и dp, но используется для размеров шрифта в View элементах.

pt – 1/72 дюйма, определяется по физическому размеру экрана. Эта единица измерения из типографии.

mm – миллиметр, определяется по физическому размеру экрана.

in – дюйм, определяется по физическому размеру экрана.

Кроме единиц измерения, используются следующие значения:

match_parent (fill_parent) – означает, что элемент займет всю доступную ему ширину или высоту в родительском элементе.

wrap_content – ширина или высота контейнера определяется его содержимым.

Layout_gravity – используется для выравнивания. Возможны варианты: top, bottom, left, right, center.

Layout_margin – используется для определения отступов.

Textstyle – используется для определения стиля тектста. Возможны следующие значения.

  • normal;

  • bold;

  • italic.

Пример установки стиля через атрибуты:

android:textStyle="bold";

Рассмотрим преобразованный файл представления activity_main.xml.

Файл activity_main.xml. Листинг 1.

xml version="1.0" encoding="utf-8"?>
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="by.colony.mikhalkevich.android.MainActivity"
android:nestedScrollingEnabled="true"
android:id="@+id/Main">

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Конфигуратор модели"
android:id="@+id/textView" />

android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/droidImageView"
android:src="@drawable/ic_launcher"
android:layout_below="@+id/categories"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="74dp" />

android:id="@+id/categories"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:entries="@array/category"
android:layout_marginTop="23dp"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_name"

android:layout_gravity="bottom|right"
android:id="@+id/button"
android:layout_below="@+id/categories"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
RelativeLayout>

  • Открывающий тег XML устанавливает различные атрибуты RelativeLayout, в частности кодировку и версию приложения.

  • атрибут xmlns, который указывает все элементы в документе, относящиеся к пространству имен android XML. Этот атрибут обязателен для указания и автоматически генерируется IDE при создании любого файла XML-разметки.

  • RelativeLayout является корневым узлом документа XML. Значение match_parent для атрибутов android:layout_width и android:layout_height. В результате макет занимает всю высоту и ширину родительского элемента макета (элемента, в который вложен данный макет).

  • Атрибут android:id = ‘@+id/Main’ предназначен для присвоения уникального id элементу.

  • Атрибут android:text = ‘@string/name’ выводит переменные из файла strings.xml.

  • Атрибут android:entries = ‘@array/category’ элемента spinner обращается к массиву category.

9 .8 Class R

Чтобы его посмотреть класс R, сначала необходимо изменить режим представления проекта. AndroidStudio по-умолчанию использует режим Android, в котором истинная структура файлов скрывается, чтобы программист мог сосредоточиться на тех файлах и папках, которые чаще всего ему нужны. В раскрывающемся списке в верхней части окна инструментов вместо режима Android, выберем режим Project.

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

9 .9 Listeners

Приложения Android управляются событиями (event-driven). Это значит, что приложение запускается и ожидает событий пользователя, например, нажатие кнопки. Когда приложение ожидает наступления события, оно прослушивает данное событие. Объект, создаваемый для ответа называется слушателем (listener).

Нам надо научить кнопку реагировать на нажатие. Для этого у кнопки есть метод setOnClickListener (View.OnClickListener). На вход подается объект с интерфейсом View.OnClickListener. Именно этому объекту кнопка поручит обрабатывать нажатия. Давайте создадим такой объект. Данный код нунжо прописать в методе onCreate.

Назначение прослушивателя события нажатия кнопки

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mQuestionTextView = (TextView) findViewById(R.id.question_text_view);

mTrueButton = (Button) findViewById(R.id.true_button);

mTrueButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mQuestionTextView.setText('нажата кнопка')

}

});

}

Слушатель реализован в виде внутреннего анонимного класса. Анонимный класс реализует интерфейс OnClickListener, и должен реализовать единственный метод данного интерфейса onClick(View).

Обработка события нажатия onClick

Существует несколько способов обработки нажатия на кнопку. 1) Традиционный для Java, с использованием интерфейсов, для этого необходимо реализовать интерфейс View.OnClickListener либо других событийных интерфейсов. 2) Разработанный специально для Android. Рассмотрим его подробнее.

Для прослушивания события onClick, можно использовать атрибут XML – onClick, который записывается в XML-коде элемента управления (в частности к Button), нажатие которого мы собираемся обрабатывать.

Добавление прослушивателя onClick в XML. Листинг 1.

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_name"

android:layout_gravity="bottom|right"
android:onClick="onClickFind"
android:id="@+id/button"
android:layout_below="@+id/categories"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

Атрибут android:onClick=’onClickFind’ элемента button на событие click запускает экшн onClickFind контроллера MainActivity.

Вернемся к контроллеру MainActivity, и преобразуем его, дописав метод onClickFind.

Экшн onclickFind контроллера MainActivity. Листинг 1.

package by.colony.mikhalkevich.android;

import android.support.v4.widget.TextViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickFind(View view){
TextView text = (TextView) findViewById(R.id.textView);
Spinner category = (Spinner) findViewById(R.id.categories);
String chooseCategory = String.valueOf(category.getSelectedItem());
text.setText(chooseCategory);
}
}

Метод onClickFind входящим параметром принимает данные текущего шаблона. В нем имеется два объекта text и category и переменную chooseCategory с данными выбранной категории. Объект text обращается к методу setText, который обновляет атрибут android:text.

Если несколько кнопок представления вызывают событием один и тот же метод, то этому методу необходимо определить какая кнопка была нажата. Сделать это можно с помощью метода getId класса View.

Метод, обрабатывающий несколько кнопок.

public void onClickFind(View v) {

//ищем второй TextView

TextView tv = (TextView)findViewById(R.id.textView2);

// определяем ID элемента и обрабатываем событие

switch (v.getId())

{

case R.id.button1:

tv.setText("Button 1");

break;

case R.id.button2:

tv.setText("Button 2");

break;

case R.id.button3:

tv.setText("Button 3");

break;

}

}

Обработчик нажатия готов.

9 .10 Fragments

Благодаря фрагментам мы можем разбивать шаблон на подшаблоны.

В папке layout приложения создаем файл представления fragment1.xml и добавим в него две кнопки:

fragment1.xml. Листинг 1.

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

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

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/b1"

android:text="Кнопка 1"/>

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/b2"

android:text="Кнопка 2"/>

LinearLayout>

Создаем в этой же папке еще один файл fragment2.xml и добавляем в него два переключателя:

fragment2.xml. Листинг 1.

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

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

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<RadioButton

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/rb"

android:text="Переключатель 1"/>

<ToggleButton

android:layout_width="fill_parent"

android:layout_height="wrap_content"

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

LinearLayout>

И еще одно представление фрагмента.

Fragment3.xml. Листинг 1.

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

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

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/iv"

android:src="@drawable/ic_launcher"

android:layout_gravity="center"/>

LinearLayout>

Теперь примемся за создание самих фрагментов, они имеют расширение java. В папке, хранящей файл MainActivity.java создаем новый пакет с именем fragments:

В этом пакете fragments создаем 3 файла java класса: fragment1, fragment2, fragment3.

Добавим в файл fragment1.java наследование класса Fragment, вместо метода onCreate в этом случае используют onCreateView, зададим внешний вид класса с созданного раньше layout - файла fragment1.xml:

Класс fragment1. Листинг 1.

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {

//Устанавливаем нашему классу внешний вид с fragment1.xml:
View frag1 = inflater.inflate(R.layout.fragment1,container,false);
return frag1;
}
}

Открываем файл fragment2 и делаем аналогично:

Класс fragment2. Листинг 1.

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
//Устанавливаем нашему классу внешний вид с fragment2.xml:
View frag2 = inflater.inflate(R.layout.fragment2,container,false);
return frag2;
}
}

В классе fragment3 аналогично подключим подшаблон fragment3.xml.

Класс fragment3. Листинг 1.

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import home.study.R;

public class fragment3 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {

//Устанавливаем нашему классу внешний вид с fragment3.xml:
View frag3 = inflater.inflate(R.layout.fragment3,container,false);
return frag3;
}
}

Для вставки созданных фрагментов в главный файл шаблона activity_main.xml воспользуемся элементом :

Вставка фрагментов. Листинг 1.

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

 

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

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

<fragment

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:name="home.study.fragments.fragment1"

tools:layout="@layout/fragment1"/>

<fragment

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:name="home.study.fragments.fragment2"

tools:layout="@layout/fragment2"/>

<fragment

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:name="home.study.fragments.fragment3"

tools:layout="@layout/fragment3"/>

LinearLayout>

9 .11 Toast pop-up messages

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

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

Отредактируем файл шаблона activity_main.xml. Добавим туда несколько кнопок, каждая из которых будет вызывать Toast сообщение определенного типа:

Прослушка события onClick элемента Button. Листинг 1.

xml version="1.0" encoding="utf-8"?>
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/t1"
android:text="Обычный Toast"
android:onClick="Toast"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/t2"
android:text="Toast с координатами положения"
android:onClick="Toast"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/t3"
android:text="Toast с изображением"
android:onClick="Toast"/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/t4"
android:text="Toast с собственным интерфейсом"
android:onClick="Toast"/>

LinearLayout>

Мы создали 4 кнопки, которые будут вызывать 4 разных вида Toast сообщения. Для всех кнопок мы задали один метод нажатия, который нужно описать.

Ставим курсор на строку:

android:onClick="Toast"

Жмем Alt+Enter и выбираем первую строку (создаем таким образом в файле MainActivity.java метод описания нажатия наших клавиш):

Переходим к созданию соответствующих Toast сообщений в файле MainActivity.java:

Создание toast-сообщений. Листинг 1.

import android.widget.Toast;

public void Toast(View view) {
switch (view.getId()){
case R.id.t1:
//Создаем обычное Toast сообщение с текстом:
Toast.makeText(MainActivity.this,"Обычное Toast сообщение",Toast.LENGTH_SHORT).show();
break;

case R.id.t2:
//Создаем Toast сообщение и задаем положение его показа на экране:
Toast toast= Toast.makeText(MainActivity.this,"Toast с координатами положения",Toast.LENGTH_LONG);
//Выставляем положение сообщения вверху экрана:
toast.setGravity(Gravity.TOP,0,0);
toast.show();
break;

case R.id.t3:
//Создаем Toast сообщение с использованием изображения:
Toast toast1=Toast.makeText(MainActivity.this,"Toast с изображением",Toast.LENGTH_LONG);
toast1.setGravity(Gravity.CENTER,0,0);
//Создаем разметку для заполнения ее изображением:
LinearLayout linearLayout=(LinearLayout)toast1.getView();
//Создаем в теле Toast объект типа ImageView:
ImageView imageView=new ImageView(MainActivity.this);
//Привязываем к нему изображение:
imageView.setImageResource(R.drawable.ic_launcher);
//Добавляем изображение к разметке для его отображения и запускаем Toast сообщение:
linearLayout.addView(imageView);
toast1.show();
break;
}
}

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

Как видите, Toast сообщение создается классом Toast прямо внутри метода обработки нажатия клавиш. Для первой кнопки мы создали простое Toast сообщение и с помощью метода makeText настроили ему текст для отображения, указали, что оно должно отображаться в нашем MainActivity и настроили длительность высвечивания сообщения LENGTH_SHORT (LENGTH_SHORT = 2 секунды, LENGTH_LONG= 3,5 секунды, это системные константы).

В случае второй кнопки "Toast с координатами положения" мы задали Toast несколько иначе и с помощью команды setGravity выставили положение (TOP - вверху экрана,0 - изменение координаты по X,0 - изменение координаты по Y), где будет высвечиваться сообщение. Обратите внимание, что здесь уже длительность отображения LENGTH_LONG.

Для третей кнопки задача еще более усложнена - подключаем в Toast сообщение отображение картинки. В теле класса Toast мы создали два объекта LinearLayout и ImageView, к объекту ImageView привязали картинку с папки drawable, и настроили ее отображение в LinearLayout.

Ну и осталось создать еще один намеченный нами в начале тип Toast сообщения - с собственным интерфейсом. Для этого сначала нужно создать файл разметки layout, в котором мы и зададим внешний вид сообщения. В папке layout создаем файл toast.xml и переходим к его редактированию:

Toast.xml. Листинг 1.

xml version="1.0" encoding="utf-8"?>
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="#ffffffff"
android:orientation="vertical"
android:id="@+id/llToast">

android:layout_height="wrap_content"
android:textColor="#ffffffff"
android:layout_width="fill_parent"
android:gravity="center"
android:background="#bb000000"
android:text="Toast сообщение"
android:id="@+id/TV1" />

android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/llToastContent"
android:layout_width="wrap_content"
android:background="#44000000">

android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:src="@drawable/ic_launcher"
android:id="@+id/tvImageToast"
android:layout_marginBottom="4dip" />

android:layout_height="wrap_content"
android:paddingRight="10dip"
android:paddingLeft="10dip"
android:layout_width="wrap_content"
android:gravity="center"
android:textColor="#ff000000"
android:id="@+id/TV2"
android:text="Toast с собственным интерфейсом"/>

LinearLayout>
LinearLayout>

Теперь вернемся в файл MainActivity.java и добавить к методу обработки щелчка Toast код для последней кнопки:

Использование шаблона во всплывающем сообщении. Листинг 1.

case R.id.t4:
//Создаем элемент View заполняем его вид с созданного файла toast.xml:
View layout=getLayoutInflater().inflate(R.layout.toast,null);
//Создаем Toast сообщение:
Toast toast3=new Toast(MainActivity.this);
//Настраиваем положение показа сообщения:
toast3.setGravity(Gravity.CENTER,0,0);
//Настраиваем продолжительность высвечивания:
toast3.setDuration(Toast.LENGTH_LONG);
//Настраиваем ему вид с созданного View layout
// (который в свою очередь уже настроен на вид с toast.xml):

toast3.setView(layout);
//Запускаем сообщение:
toast3.show();
break;

9 .12 SQLite

Существует два основных способа хранения данных в android: Preferences и SQLite. Preferences – самый простой, но ограничен по возможностям в сравнении SQLite.

SQLite – это база с таблицами и запросами.

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

Шаблон для добавления и очистки контактов. Листинг 1.

xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
TextView>
android:id="@+id/etName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1">

requestFocus>
EditText>
LinearLayout>
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
TextView>
android:id="@+id/etEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1">
EditText>
LinearLayout>
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add">
Button>
android:id="@+id/btnRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Read">
Button>
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clear">
Button>
LinearLayout>
LinearLayout>

На экране увидим форму с двумя элементами ввода и тремя кнопками.

В файл MainActivity.java вставим следующий код.

Подключение и работа с базой SQLite. Листинг 1.

package by.colony.mikhalkevich.contacts;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

final String LOG_TAG = "myLogs";

Button btnAdd, btnRead, btnClear;
EditText etName, etEmail;

DBHelper dbHelper;


@Override
public void onCreate(Bundle savedInstanceState) {

/** В методе Activity - onCreate мы определяем объекты, присваиваем обработчики и создаем объект dbHelper класса DBHelper для управления БД.*/


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(this);

btnRead = (Button) findViewById(R.id.btnRead);
btnRead.setOnClickListener(this);

btnClear = (Button) findViewById(R.id.btnClear);
btnClear.setOnClickListener(this);

etName = (EditText) findViewById(R.id.etName);
etEmail = (EditText) findViewById(R.id.etEmail);

// создаем объект для создания и управления версиями БД
dbHelper = new DBHelper(this);
}


@Override
public void onClick(View v) {

// создаем объект для данных
ContentValues cv = new ContentValues();

// получаем данные из полей ввода
String name = etName.getText().toString();
String email = etEmail.getText().toString();

// подключаемся к БД
SQLiteDatabase db = dbHelper.getWritableDatabase();


switch (v.getId()) {
case R.id.btnAdd:
Log.d(LOG_TAG, "--- Insert in mytable: ---");
// подготовим данные для вставки в виде пар: наименование столбца - значение

cv.put("name", name);
cv.put("email", email);
// вставляем запись и получаем ее ID. Первое значение – имя таблицы, второе используется для вставки пустых значений, третье значение – собранные значения.
long rowID = db.insert("mytable", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowID);
break;
case R.id.btnRead:
Log.d(LOG_TAG, "--- Rows in mytable: ---");
// делаем запрос всех данных из таблицы mytable, получаем Cursor
Cursor c = db.query("mytable", null, null, null, null, null, null);

// ставим позицию курсора на первую строку выборки
// если в выборке нет строк, вернется
false
if (c.moveToFirst()) {

// определяем номера столбцов по имени в выборке
int idColIndex = c.getColumnIndex("id");
int nameColIndex = c.getColumnIndex("name");
int emailColIndex = c.getColumnIndex("email");

do {
// получаем значения по номерам столбцов и пишем все в лог
Log.d(LOG_TAG,
"ID = " + c.getInt(idColIndex) +
", name = " + c.getString(nameColIndex) +
", email = " + c.getString(emailColIndex));
// переход на следующую строку
// а если следующей нет (текущая - последняя), то
false - выходим из цикла
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "0 rows");
c.close();
break;
case R.id.btnClear:
Log.d(LOG_TAG, "--- Clear mytable: ---");
// удаляем все записи
int clearCount = db.delete("mytable", null, null);
Log.d(LOG_TAG, "deleted rows count = " + clearCount);
break;
}
// закрываем подключение к БД
dbHelper.close();
}



class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "--- onCreate database ---");
// создаем таблицу с полями
db.execSQL("create table mytable ("
+ "id integer primary key autoincrement,"
+ "name text,"
+ "email text" + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

}

В методе Activity - onCreate мы определяем объекты, присваиваем обработчики и создаем объект dbHelper класса DBHelper для управления БД. Сам класс будет описан ниже.

 В методе Activity – onClick мы обрабатываем нажатия на кнопки.

Класс ContentValues используется для указания полей таблицы и значений, которые мы в эти поля будем вставлять. Мы создаем объект cv, и позже его используем. Далее мы записываем в переменные значения из полей ввода. Затем, с помощью метода getWritableDatabase подключаемся к БД и получаем объект SQLiteDatabase. Он позволит нам работать с БД. Мы будем использовать его методы insert – вставка записи, query – чтение, delete – удаление. У них много разных параметров на вход, но мы пока используем самый минимум.

Далее смотрим, какая кнопка была нажата:

btnAdd – добавление записи в таблицу mytable.  Мы заполняем объект cv парами: имя поля и значение. И (при вставке записи в таблицу) в указанные поля будут вставлены соответствующие значения. Мы заполняем поля name и email. id у нас заполнится автоматически (primary key autoincrement). Вызываем метод insert – передаем ему имя таблицы и объект cv с вставляемыми значениями. Второй аргумент метода используется, при вставке в таблицу пустой строки. Нам это сейчас не нужно, поэтому передаем null. Метод insert возвращает ID вставленной строки, мы его сохраняем в rowID и выводим в лог.

btnRead – чтение всех записей из таблицы mytable. Для чтения используется метод query. На вход ему подается имя таблицы, список запрашиваемых полей, условия выборки, группировка, сортировка. Т.к. нам нужны все данные во всех полях без сортировок и группировок - мы используем везде null. Только имя таблицы указываем. Метод возвращает нам объект класса Cursor. Его можно рассматривать как таблицу с данными. Метод moveToFirst – делает первую запись в Cursor активной и заодно проверяет, есть ли вообще записи в нем (т.е. выбралось ли что-либо в методе query). Далее мы получаем порядковые номера столбцов в Cursor по их именам с помощью метода getColumnIndex. Эти номера потом используем для чтения данных в методах getInt и getString и выводим данные в лог. С помощью метода moveToNext мы перебираем все строки в Cursor пока не добираемся до последней. Если же записей не было, то выводим в лог соответствующее сообщение – 0 rows. В конце закрываем курсор (освобождаем занимаемые им ресурсы) методом close, т.к. далее мы его нигде не используем. 

btnClear – очистка таблицы. Метод delete удаляет записи. На вход передаем имя таблицы и null в качестве условий для удаления, а значит удалится все. Метод возвращает кол-во удаленных записей.

После этого закрываем соединение с БД методом close.

Класс DBHelper является вложенным в MainActivity и описан в конце кода. Класс должен наследовать класс SQLiteOpenHelper.

В конструкторе мы вызываем конструктор суперкласса и передаем ему:
context - контекст
mydb - название базы данных
null – объект для работы с курсорами, нам пока не нужен, поэтому null
1 – версия базы данных

В методе onCreate этого класса мы используем метод execSQL объекта SQLiteDatabase для выполнения SQL-запроса, который создает таблицу. Напомню – этот метод вызывается, если БД не существует и ее надо создавать. По запросу видно, что мы создаем таблицу mytable с полями id, name и email.

Метод onUpgrade пока не заполняем, т.к. используем одну версию БД и менять ее не планируем.

Еще один пример работы с базой SQLite - https://github.com/feliperfranca/Android-CRUD

10 Cross-platform development

PhoneGap seeks to address these problems by including a unified API for using Web technologies in native apps as well as project templates developers can use for Android and iOS apps. As of this writing, Windows Phone 7 isn’t supported, but support for this platform is forthcoming. By the time you read this, it might already be available.
PhoneGap was developed by Nitobi, Inc., which was recently acquired by Adobe Systems, Inc. It’s open source and available to developers free under an Apache Software Foundation license. This license allows you to do almost anything with the code as long as you include
Nitobi’s copyright notice. To view details of the license, go to www.phonegap.com/about/ license.
This tool also has a unified API for accessing native device capabilities, which are built-in features of the device. These capabilities include Accelerometer, Camera, Capture, Compass, Connection, Contacts, Device, Events, File, Geolocation, Media, Notification, and Storage.
You have access to all these capabilities through JavaScript.
The end product of a PhoneGap project is an app that looks and behaves like a native app. You can deploy it to any marketplace and be confident it will be approved, as long as you adhere to the marketplace rules.

 

11 GIT

Git — распределённая система управления версиями.

Примерами проектов, использующих Git, являются Ядро Linux, Swift, Android, Drupal, Cairo, GNU Core Utilities, Mesa, Wine, Chromium, Compiz Fusion, FlightGear, jQuery, PHP, NASM, MediaWiki, DokuWiki, Qt и некоторые дистрибутивы Linux

Преимущества и недостатки git по сравнению с централизованными системами управления версиями (такими как, например, Subversion) типичны для любой распределённой системы и описаны в статье «Система управления версиями». Если же сравнивать git с «родственными» ей распределёнными системами, можно отметить, что git изначально идеологически ориентирован на работу с изменениями, а не с файлами, «единицей обработки» для него является набор изменений, или патч. Эта особенность прослеживается как в структуре самой системы (в частности — в структуре репозитория), так и в принципах построения команд; она отражается на производительности системы в различных вариантах её использования и на достоинствах и недостатках git по сравнению с другими DVCS.

Часто называемые преимущества git перед другими DVCS:

В числе недостатков git обычно называют:

Заключение

Список использованных источников

Приложения

1. [picture] 5b32a82820990_mvc.png