1 / 48

Платформа Android

Платформа Android. Ведущий семинара: Максим Лейкин, компания «МЕРА НН». План семинара. 1. Android - FAQ 2 . Инструменты Android- разработчика 3. Примеры приложений Жизненный цикл приложения + AsyncTasks , Threads Простые ресурсы , размещения Элементы управления Хранилища данных

Download Presentation

Платформа Android

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Платформа Android Ведущий семинара: Максим Лейкин, компания «МЕРА НН»

  2. Плансеминара 1. Android - FAQ 2. Инструменты Android-разработчика 3.Примеры приложений Жизненный цикл приложения + AsyncTasks, Threads Простые ресурсы, размещения Элементы управления Хранилища данных Content Providers Intents, receivers Сервисы LBS-приложения

  3. Плансеминара Часть 1. Android - FAQ Что такое Android? Кто его разрабатывает? Какие версии Android существуют? Какие аппаратные платформы поддерживаются? Под какой лицензией распространяется Android? В чем ключевые особенности Android? Из чего состоит Android? Какова доля Android на рынке мобильных платформ? Какие существуют устройства на платформе Android? Что такое Google Play? В чем преимущества и недостатки платформы Android?

  4. Android Activity Lifecycle В любой момент времени всякая активность может находиться в одном из 4-х состояний: Active – видна на экране и может взаимодействовать с пользователем Paused – видна на экране, но не может взаимодействовать с пользователем (не имеет фокуса ввода), например по причине перекрытия всплывающим окном. Состояние сохраняется. Может быть уничтожена системой в случае серьезной нехватки памяти Stopped – запущена, но не видна пользователю и не может взаимодействовать с ним. Состояние сохраняется. Может быть уничтожена системой в случае нехватки памяти Dead – активность небыла запущена, либо была снята с выполнения системой из-за нехватки ресурсов . Состояние не сохраняется.

  5. Android Activity Lifecycle Foreground lifetime Entire lifetime Visible lifetime

  6. Android Activity Lifecycle public class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); } Внимание! Сохранять состояние активности надо в методе onPause(), а не в onSaveInstanceState(Bundle), последний может в некоторых случаях не вызываться.

  7. Android Activity Lifecycle

  8. Intents • Intent – специальный объект, который используется для передачи сообщений между компонентами как внутри одного приложения так и между разными приложениями. • С помощью Intents системе передается намерение совершить какое-либо действие и данные, с которыми надо совершить это действие. • В ОС Android с помощью Intents можно делать следующее: • стартовать другие активности (явно или неявно) • передавать «широковещательные» сообщения операционной системе • получать «широковещательные» сообщения от операционной системы • Intents – рекомендованный способ взаимдействия между компонентами даже внутри одного приложения.

  9. Intents • Структура Intent • Обязательные параметры: • action – действие, которое нужно произвести, например ACTION_VIEW, ACTION_EDIT, etc. • data – элемент данных, над которым надо произвести action, задается с помощью Uri

  10. Intents • Структура Intent • 2) Необязательные параметры: • category – дополнительная информация о действии, которое нужно произвести (например, CATEGORY_LAUNCHER, СATEGORY_ALTERNATIVE) • type – позволяет явно указать MIME type данных, поставляемых с Intent (обычно извлекается из data) • component - позволяет явно указать имя класса, для выполнения Intent (обычно извлекается из action, data/type,categories).Если указан – перекрывает действие всех остальных атрибутов. • extras – дополнительные данные, в виде набора пар «ключ-значение»

  11. Intents: запуск активностей Явно (explicitly): Intent intent = new Intent(MyActivity.this, MyOtherActivity.class); startActivity(intent); Внимание! Вызываемая активность д.б. прописана в AndroidManifest.xml

  12. Intents: запуск активностей Неявно (implicitly): Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-2368”)); startActivity(intent);

  13. Приложение SimpleCaller /res/values/strings.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, SimpleCallerActivity!</string> <string name="app_name">SimpleCaller</string> <string name="call">Call</string> <string name="number">Number:</string> </resources>

  14. Приложение SimpleCaller /src/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/number" /> <EditText android:id="@+id/Number" android:layout_width="103dp" android:layout_height="wrap_content" /> <Button android:layout_height="wrap_content" android:text="@string/call" android:layout_width="wrap_content" android:id="@+id/btnCall"> </Button> </LinearLayout>

  15. Приложение SimpleCaller /src/com/nnsu/mobileweek/SimpleCallerActivity.java: package com.nnsu.mobileweek; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class SimpleCallerActivity extends Activity implements OnClickListener{ /** Called when the activity is first created. */ Button btnCall; EditTextnumberField;

  16. Приложение SimpleCaller /src/com/nnsu/mobileweek/SimpleCallerActivity.java: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnCall = (Button)findViewById(R.id.btnCall); numberField = (EditText)findViewById(R.id.Number); btnCall.setOnClickListener(this); } private void phoneCall() { String phoneCallUri = "tel:" + numberField.getText().toString(); Intent phoneCallIntent = new Intent(Intent.ACTION_CALL); phoneCallIntent.setData(Uri.parse(phoneCallUri)); startActivity(phoneCallIntent); } public void onClick(View v) { phoneCall(); } }

  17. Приложение SimpleCaller AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nnsu.mobileweek" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name" android:debuggable="true"> <activity android:name=".SimpleCallerActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CALL_PHONE" /> </manifest>

  18. Приложение SimpleCaller

  19. Приложение SimpleCaller

  20. Intents: Intent Filters Intent Filters предназначены для того, чтобы сообщить операционной системе, что компонент (активность, сервис) может принимать и обрабатывать Intents, c параметрами определенного типа. В приложении создается Intent, заполняются параметры action, data, category. С помощью startActivity() этот Intent отправляется на поиски подходящей Activity, которая сможет выполнить то, что определено параметрами Intent.В системе есть разные приложения, и в каждом из них несколько Activity. Для некоторых Activity определен IntentFilterт.д.), для некоторых нет. Метод startActivity() сверяет набор параметров Intent и наборы параметров IntentFilter для каждой Activity. Если наборы совпадают – Activityсчитается подходящей. Если в итоге нашлась только одна Activity – она и отображается. Если же нашлось несколько подходящих Activity, то пользователю выводится список, где он может сам выбрать какое приложение ему использовать.

  21. Intents: Intent Filters Для задания Intent Filter используется тег intent-filter в файле AndroidManifest.xml: <activity android:name=".TourViewActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.com.niit.android" /> </intent-filter> </activity> 1) action – задает действие, которое надо свершить или компонент, который надо запустить 2) category – определяет, при каких условиях надо совершить action 3) data – набор дополнительных данных, который используется при выборе компонента, выполняющего Intent, и передается ему для обработки Можно считать, что Intent – ключ, IntentFilter - замок

  22. Intents: Resolution Rules • Собирается список всех доступных Intent Filters • Intent Filters,которые не соответствуют действию или категории удаляются из списка. • Совпадение происходит только в том случае, если Intent Filter содержит указанное действие (или если действие для него вовсе не задано). Совпадения не произойдет, только если ни одно из действий Intent Filter не будет эквивалентно тому, которое задано в Intent • Для категорий процесс соответствия более строгий. Intent Filter должен включать в себя все категории, заданные в полученном Intent. Фильтр, для которого категории не указаны, может соответствовать только таким же Intent без категорий. • Каждая часть пути URI из Intentсравнивается с тегом data Intent Filter. Если в Intent Filterуказаны схема (протокол), сервер/принадлежность, путь или тип MIME, все эти значения проверяются на соответствие пути URI из Intent.При любом несовпадении Фильтр будет удален из списка. Если в Intent Filterне указано ни одного параметра data, его действие будет распространяться на любые данные.

  23. Intents: Resolution Rules • MIME — тип данных, который должен совпасть. При сравнении типов данных вы можете использовать маски, чтобы охватывать все подтипы (например, cats/*). Если в Intent Filter указан тип данных, он должен совпасть с тем, который значится в намерении, при отсутствии тега data подойдет любой тип. • Схема — это протокольная часть пути URI, например http:, mailto: или tel:. • Имя сервера (или принадлежность данных) — часть URI между схемой и самим путем (например, www.google.com). Чтобы совпало имя сервера, схема Intent Filter также должна подойти. • После имени сервера идет путь к данным (например, /ig). Путь пройдет проверку только после схемы и имени сервера, содержащихся в теге. • 4) Если вышеописанный процесс возвращает более одного совпадения, пользователю выводится список со всеми вариантами • Sample 15

  24. Intents: чтение Intent Если активность была запущена в результате совпадения Intent с IntentFilter, то она может получить Intent, с которым ее вызывали: public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); Intent intent = getIntent(); String action = intent.getAction(); Uri data = intent.getData(); }

  25. Intents: передача Intent Можно передать Intent в активность, следующую в списке подходящих (предварительно выполнив проверки\обработки): Intent intent = getIntent(); if (isAfterMidnight){ startNextMatchingActivity(intent); }

  26. Intents: возврат результата из активности Основная активность: private static final int SHOW_SUBACTIVITY = 1; Intent intent = new Intent(this, MyOtherActivity.class); startActivityForResult(intent, SHOW_SUBACTIVITY); ... private static final int PICK_CONTACT_SUBACTIVITY = 2; Uri uri = Uri.parse(“content://contacts/people”); Intent intent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

  27. Intents: возврат результата из активности Вспомогательная активность Button okButton = (Button) findViewById(R.id.ok_button); okButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Uri data = Uri.parse(“content://vendors/” + vendor_id); Intent result = new Intent(null, data); result.putExtra(IS_INPUT_CORRECT, inputCorrect); setResult(RESULT_OK, result); finish(); } });

  28. Intents: возврат результата из активности • Обработка возвращенного результата: • public void onActivityResult(intrequestCode, • intresultCode,Intent data) • requestCode – код, с которым была запущена активность (переданный в кач-ве второго параметра в startActivityForResult()) • resultCode – код, возвращенный из активности, обычно Activity.RESULT_OKилиActivity.RESULT_CANCELLED • data – Intent, сорфмированный по результатам запуска sub-Activity

  29. Intents: возврат результата из активности private static final int SHOW_SUB_ACTIVITY_ONE = 1; private static final int SHOW_SUB_ACTIVITY_TWO = 2; public void onActivityResult(intrequestCode, intresultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (SHOW_SUB_ACTIVITY_ONE) : if (resultCode == Activity.RESULT_OK) { Uri vendor = data.getData(); booleaninputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false); } break; case (SHOW_SUB_ACTIVITY_TWO) : if (resultCode == Activity.RESULT_OK) { // TODO: Handle OK click. } break; } }

  30. Отладка Android-приложений Отладка из Eclipse: - The Debug Perspective - The DDMS Perspective (Dalvik Debug Monitor Server )

  31. Отладка Android-приложений: Breakpoints

  32. Отладка Android-приложений: запуск в debug

  33. Отладка Android-приложений: Debug Perspective Debug – показывает отлаживаемые приложения и выполняющиеся в данный момент потоки Variables – значения переменных (работает если есть установленные breakpoints) Breakpoints – расставленные точки останова LogCat – Системные сообщения платформы(в т.ч. exceptions)

  34. Отладка Android-приложений: Debug Perspective

  35. Отладка Android-приложений: DDMS Perspective Devices – список подключенных эмуляторов и устройств Threads – выполняющиеся потоки Emulator Control – управление эмулятором Allocation Tracker – выделение памяти Allocation Tracker – выделение памяти Heap – использование динамической памяти

  36. Android-приложения работающие с картами и GPS Все устройства на платформе Android включают датчик GPS и встроенные средства работы с данными местоположения и картами. Устройства на платформе Android позволяют определять местоположение одним из 3-х способов: датчик GPS Cell-ID (триангуляция) Wi-Fi spots Типовая задача: Получить координаты с датчика GPS Показать местоположение на карте Google Maps

  37. Google API vs. Android API

  38. Приложение LocationMaps /res/values/strings.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, AndroidMapsActivity!</string> <string name="app_name">AndroidMaps</string> <string name="lat">Latitude</string> <string name="lon">Longitude</string> </resources>

  39. Приложение LocationMaps /src/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/bFindMe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Find Me!" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/lat" />

  40. Приложение LocationMaps <EditText android:id="@+id/etLatitude" android:layout_width="103dp" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/lon" /> <EditText android:id="@+id/etLongitude" android:layout_width="103dp" android:layout_height="wrap_content" /> <Button android:id="@+id/bShowMe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Me!" /> </LinearLayout>

  41. Приложение LocationMaps /src/com/nnsu/mobileweek/AndroidMapsActivity.java: package com.nnsu.mobileweek; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText;

  42. Приложение LocationMaps /src/com/nnsu/mobileweek/AndroidMapsActivity.java: public class AndroidMapsActivity extends Activity implements LocationListener { EditTextlat, lon; Button btnShow, btnFind; LocationManagerlocMgr; /** Called when the activity is first created. */ public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); Button btnShow=(Button)findViewById(R.id.bShowMe); Button btnFind=(Button)findViewById(R.id.bFindMe); lat=(EditText)findViewById(R.id.etLatitude); lon=(EditText)findViewById(R.id.etLongitude);

  43. Приложение LocationMaps /src/com/nnsu/mobileweek/AndroidMapsActivity.java: btnShow.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String _lat=lat.getText().toString(); String _lon=lon.getText().toString(); Uri uri=Uri.parse("geo:"+_lat+","+_lon); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); btnFind.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { getFix(); } } ); }

  44. Приложение LocationMaps /src/com/nnsu/mobileweek/AndroidMapsActivity.java: public void getFix() { locMgr= (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locMgr.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0L, 0, this); } public void onLocationChanged(final Location location) { this.runOnUiThread(new Runnable() { public void run() { lat.setText(new Double(location.getLatitude()).toString()); lon.setText(new Double(location.getLongitude()).toString()); } } ); }

  45. Приложение LocationMaps /src/com/nnsu/mobileweek/AndroidMapsActivity.java: public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }

  46. Приложение LocationMaps AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nnsu.mobileweek" android:versionCode="1" android:versionName="1.0" > <uses-sdkandroid:minSdkVersion="9" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AndroidMapsActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>

  47. Приложение LocationMaps

  48. Приложение LocationMaps

More Related