Разработка мобильных приложений под Android Чиркунов Кирилл cyril.chirkunov@computer.org vk.com/chirkunov.

Презентация:



Advertisements
Похожие презентации
© 2001, Cisco Systems, Inc. CSIDS Chapter 9 Signature and Intrusion Detection Configuration.
Advertisements

© 2006 Cisco Systems, Inc. All rights reserved.ISCW v Cisco IOS Threat Defense Features Configuring Cisco IOS IPS.
Using Dreamweaver MX Slide 1 Window menu Manage Sites… Window menu Manage Sites… 2 2 Open Dreamweaver 1 1 Set up a website folder (1). Click New…
© 2006 Cisco Systems, Inc. All rights reserved. HIPS v Administering Events and Generating Reports Managing Events.
Test 17 Вопрос 1. public class TKO { public static void main(String[] args) { String s = "-"; Integer x = 343; long L343 = 343L; if (x.equals(L343)) s.
Structured Error Handling in the ABL Sarah Marshall QA Architect, OpenEdge Session 128.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(two"); lst.add(three");
© 2001, Cisco Systems, Inc. CSIDS Chapter 6 Alarm Management.
© 2006 Cisco Systems, Inc. All rights reserved. HIPS v Configuring Rules Configuring Rules Common to Windows and UNIX.
Overview of the Paysonnel CE. Overview Paysonnel CE Go to URL- 1 Click [Login to Paysonnel CE] 2 How to Log-in to Paysonnel CE 1 2.
Java Collections Framework (JCF) in Java Tutorial for students of universities Author: Oxana Dudnik.
© 2003, Cisco Systems, Inc. All rights reserved. CSVPN Lesson 10 Configure the Cisco VPN 3002 Hardware Client for Remote Access Using Pre-Shared.
PAT312, Section 21, December 2006 S21-1 Copyright 2007 MSC.Software Corporation SECTION 21 GROUPS.
WS4-1 PAT328, Workshop 4, September 2004 Copyright 2004 MSC.Software Corporation WORKSHOP 4 POST PROCESSING USING PLOT SET.
© 2005 Cisco Systems, Inc. All rights reserved. IPTX v Configuring Additional Cisco CallManager Express Features Configuring Cisco CallManager Express.
Test 14 Вопрос 1. class Main { public void method() { static class One { public One() { System.out.println("From one"); } } public static void main(String...
Arrays Dr. Ramzi Saifan Slides adapted from Prof. Steven Roehrig.
PAT312, Section 18, December 2006 S18-1 Copyright 2007 MSC.Software Corporation SECTION 18 LOADS & BOUNDARY CONDITIONS.
1/27 Chapter 9: Template Functions And Template Classes.

Транксрипт:

Разработка мобильных приложений под Android Чиркунов Кирилл vk.com/chirkunov

На прошлой лекции Лекция 4, слайд 1 Новосибирский государственный университет, 2012 Views (GroupView, TextView, Spinner, EditView and etc.) Views (GroupView, TextView, Spinner, EditView and etc.) AbsoluteLayout, FrameLayout, LinearLayout, TableLayout, Gallery, RelativeLayout AbsoluteLayout, FrameLayout, LinearLayout, TableLayout, Gallery, RelativeLayout Оптимизация разметки Оптимизация разметки Drawables & Menus Drawables & Menus

Сегодня Intents & Receivers Intents & Receivers Broadcast messaging Broadcast messaging Data Adapters Data Adapters Preferences & Settings & Files Preferences & Settings & Files Лекция 4, слайд 2 Новосибирский государственный университет, 2012

Намерения (Intents) Лекция 4, слайд 3 Новосибирский государственный университет, 2012 Применяются для: объявления о запуске Activity или Service, чтобы выполнить какие-либо действия на основе некоторых данных передачи уведомлений о том, что произошло событие явного запуска определенного Service или Activity

Код результата закрытия Activity Лекция 4, слайд 4 Новосибирский государственный университет, 2012 Вызов из родительской активности: startActivityForResult(Intent i, int call_Identificator) Выставление результата в дочерней активности: setResult(int result, Intent i) Коды возврата: Activity.RESULT_OK Activity.RESULT_CANCELED (по умолчанию) Другие, более специализированные: RESULT_FIRST_USER RESULT_COMMON_ERROR и др.

Код результата закрытия Activity Лекция 4, слайд public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (SHOW_SUB_ACTIVITY_ONE) : { if (resultCode == Activity.RESULT_OK) { Uri horse = data.getData(); boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false); String selectedPistol = data.getStringExtra(SELECTED_PISTOL); } break; } case (SHOW_SUB_ACTIVITY_TWO) : { if (resultCode == Activity.RESULT_OK) { // TODO: Handle OK click. } break; }

Лекция 4, слайд 6 Новосибирский государственный университет, 2012 Стандартные действия (часть) ACTION_VIEWACTION_SENDACTION_MAIN ACTION_DIALACTION_SENDTO ACTION_CALL ACTION_EDITACTION_ANSWER ACTION_WEB_SEARCH ACTION_SEARCHACTION_INSERT ACTION_DELETE

Лекция 4, слайд 7 Новосибирский государственный университет, 2012 Стандартные категории (не все) CATEGORY_DEFAULTCATEGORY_SELECTED_ALTERNATIVE CATEGORY_BROWSABLECATEGORY_LAUNCHER CATEGORY_GADGETCATEGORY_HOME CATEGORY_ALTERNATIVECATEGORY_PREFERENCE

Данные намерения Новосибирский государственный университет, 2012 Лекция 4, слайд 8 Google.com Microsoft.com и т.д. Имя хоста image/jpeg audio/mpeg4-generic vnd. android.cursor.dir/* и т.д. Тип данных (MIME type, case sensitive) Доступные значения для пути (/transport/ports) Путь Доступные порты для заданного сервера Порт http Content и др. Схема данных … Extra

Утверждение намерений Лекция 4, слайд 9 Новосибирский государственный университет, 2012 Система собирает список всех доступных Intent-Filters из установленных пакетов Фильтры, которые не соответствуют действию или категории Intent, удаляются Каждая часть пути URI из намерения сравнивается с разделом data фильтра Intent-Filter Когда есть несколько совпадений, пользователю предлагается выбрать Activity из списка

Делегирование намерений Лекция 4, слайд 10 Новосибирский государственный университет, 2012 Intent intent = getIntent(); … //some code startNextMatchingActivity(intent);

Выбор контакта из списка (демо) Лекция 4, слайд 11 Новосибирский государственный университет, 2012

Расширяемость меню Лекция 4, слайд 12 Новосибирский государственный университет, public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); Intent intent = new Intent(); intent.setData(MoonBaseProvider.CONTENT_URI); intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE); int menuGroup = 0; int menuItemId = 0; int menuItemOrder = Menu.NONE; ComponentName caller = getComponentName(); Intent[] specificIntents = null; // The menu items created from the previous Intents // will populate this array. MenuItem[] outSpecificItems = null; // Set any optional flags. int flags = Menu.FLAG_APPEND_TO_GROUP; // Populate the menu menu.addIntentOptions(menuGroup, menuItemId,menuItemOrder,caller, specificIntents, intent, flags, outSpecificItems); return true; }

Linkify Лекция 4, слайд 13 Новосибирский государственный университет, 2012 TextView textView = (TextView) findViewById (R.id.myTextView); Linkify.addLinks (textView, Linkify.WEB_URLS|Linkify. _ADDRESSES); Определение через код: Определение через xml-файл: Определение через регулярные выражения: int flags = Pattern.CASE_INSENSITIVE; Pattern p = Pattern.compile("\\bquake[0-9]*\\b", flags); Linkify.addLinks(myTextView, p, "content://com.paad.earthquake/earthquakes/");

Linkify MatchModifier & TransformFilter Лекция 4, слайд 14 Новосибирский государственный университет, 2012 class MyMatchFilter implements MatchFilter { public boolean acceptMatch(CharSequence s, int start, int end) { return (start == 0 || s.charAt(start-1) != '!'); } class MyTransformFilter implements TransformFilter { public String transformUrl(Matcher match, String url) { return url.toLowerCase(); } Linkify.addLinks(myTextView, pattern, prefixWith, new MyMatchFilter(), new MyTransformFilter());

Оповещение о событиях Лекция 4, слайд 15 Новосибирский государственный университет, 2012 Intent intent = new Intent(NEW_LIFEFORM_DETECTED); intent.putExtra("lifeformName", lifeformType); intent.putExtra("longitude", currentLongitude); intent.putExtra("latitude", currentLatitude); sendBroadcast(intent); public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver { public static final String BURN = public void onReceive(Context context, Intent intent) { // Get the lifeform details from the intent. Uri data = intent.getData(); String type = intent.getStringExtra("type"); double lat = intent.getDoubleExtra("latitude", 0); double lng = intent.getDoubleExtra("longitude", 0); Location loc = new Location("gps"); loc.setLatitude(lat); loc.setLongitude(lng); if (type.equals("alien")) { Intent startIntent = new Intent(BURN, data); startIntent.putExtra("latitude", lat); startIntent.putExtra("longitude", lng); context.startActivity(startIntent); } } }

Регистрация широковещательного приемника Лекция 4, слайд 16 Новосибирский государственный университет, 2012 Через manifest.xml: Через код: IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED); LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver(); registerReceiver(r, filter); … unregisterReceiver(receiver);

Продвинутое оповещение Упорядоченное оповещение: sendOrderedBroadcast(intent, null) sendOrderedBroadcast(intent, null, myBroadcastReceiver, null, Activity.RESULT_OK, null, null); «Липкие» трансляции (требуется полномочие BROADCAST_STICKY) sendStickyBroadcast removeStickyBroadcast Лекция 4, слайд 17 Новосибирский государственный университет, 2012

Ожидающие намерения (Pending Intents) Лекция 4, слайд 18 Новосибирский государственный университет, 2012 // Start an Activity Intent startActivityIntent = new Intent(this, MyOtherActivity.class); PendingIntent.getActivity(this, 0, startActivityIntent, 0); // Broadcast an Intent Intent broadcastIntent = new Intent(NEW_LIFEFORM_DETECTED); PendingIntent.getBroadcast(this, 0, broadcastIntent, 0);

Адаптеры Интерфейс Adapter Наследники: ArrayAdapter SimpleCursorAdapter BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SpinnerAdapter, WrapperListAdapter Пользовательские адаптеры поддерживающие привязку к представлениям, наследникам абстрактного класса AdapterView Лекция 4, слайд 19 Новосибирский государственный университет, 2012

Адаптеры (пример) public class MyArrayAdapter extends ArrayAdapter { int resource; public ToDoItemAdapter(Context context, int resource, List items) { super(context, resource, items); resource = _resource; public View getView(int position, View convertView, ViewGroup parent) { LinearLayout newView; MyClass classInstance = getItem(position); // TODO Retrieve values to display from the // classInstance variable. // Inflate a new view if this is not an update. if (convertView == null) { newView = new LinearLayout(getContext()); String inflater = Context.LAYOUT_INFLATER_SERVICE; LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater); vi.inflate(resource, newView, true); } else { newView = (LinearLayout)convertView; } // TODO Retrieve the Views to populate // TODO Populate the Views with object property values. return todoView; } Лекция 4, слайд 20 Новосибирский государственный университет, 2012

Использование адаптеров Лекция 4, слайд 21 Новосибирский государственный университет, 2012 ArrayList myStringArray = new ArrayList (); ArrayAdapter myAdapterInstance; int layoutID = android.R.layout.simple_list_item_1; myAdapterInstance = new ArrayAdapter (this, layoutID, myStringArray); myListView.setAdapter(myAdapterInstance); String uriString = "content://contacts/people/"; Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null); String[] fromColumns = new String[] {People.NUMBER, People.NAME}; int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView}; SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this, R.layout.simplecursorlayout, myCursor, fromColumns, toLayoutIDs); myListView.setAdapter(myAdapter);

Использование адаптеров Лекция 4, слайд 22 Новосибирский государственный университет, 2012 String uriString = "content://contacts/people/"; Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null); String[] fromColumns = new String[] {People.NUMBER, People.NAME}; int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView}; SimpleCursorAdapter myAdapter; myAdapter = new SimpleCursorAdapter(this, R.layout.simplecursorlayout, myCursor, fromColumns, toLayoutIDs); myListView.setAdapter(myAdapter);

Internet resources Лекция 4, слайд 23 Новосибирский государственный университет, 2012 String myFeed = getString(R.string.my_feed); try { URL url = new URL(myFeed); URLConnection connection = url.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection)connection; int responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream in = httpConnection.getInputStream(); [... Process the input stream as required... ] } catch (MalformedURLException e) { } catch (IOException e) { }

Лекция 4, слайд 24 Новосибирский государственный университет, 2012 Диалоговые окна Класс Dialog и его производные Специальные диалоговые окна: AlertDialog CharacterPickerDialog DatePickerDialog TimePickerDialog ProgressDialog Activity в модальном режиме

Управление диалогами Новосибирский государственный университет, 2012 Лекция 4, слайд 25 static final private int TIME_DIALOG = public Dialog onCreateDialog(int id) { switch(id) { case (TIME_DIALOG) : AlertDialog.Builder timeDialog = new AlertDialog.Builder(this); timeDialog.setTitle("The Current Time Is..."); timeDialog.setMessage("Now"); return timeDialog.create(); } return null; public void onPrepareDialog(int id, Dialog dialog) { switch(id) { case (TIME_DIALOG) : SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); Date currentTime = new Date(java.lang.System.currentTimeMillis()); String dateString = sdf.format(currentTime); AlertDialog timeDialog = (AlertDialog)dialog; timeDialog.setMessage(dateString); break; }

Просмотр данных о землетрясениях (демо) Новосибирский государственный университет, 2012 Лекция 4, слайд 26

Работа с файлами Новосибирский государственный университет, 2012 Лекция 4, слайд 27 String FILE_NAME = "tempfile.tmp"; // Create a new output file stream thats private to this application. FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); // Create a new file input stream. FileInputStream fis = openFileInput(FILE_NAME); Типы режимов доступа к файлам MODE_APPEND MODE_PRIVATE MODE_WORLD_READABLE MODE_WORLD_WRITEABLE Resources myResources = getResources(); InputStream myFile = myResources.openRawResource(R.raw.myfileName ) Доступ к файлам из ресурсов: Другие операции: deleteFile, fileList (также см. java.io.File)

Настройки Новосибирский государственный университет, 2012 Лекция 4, слайд 28 Общие (SharedPreferences) Состояние приложения/активности (Bundle) Поддерживаемые типы: boolean string float long integer

Общие настройки Новосибирский государственный университет, 2012 Лекция 4, слайд 29 // Get the stored preferences int mode = Activity.MODE_PRIVATE; final String MY_PREFS = "MY_PREFS"; SharedPreferences mySharedPreferences = getSharedPreferences(MY_PREFS, mode); // Retrieve the saved values. boolean isTrue = mySharedPreferences.getBoolean("isTrue", false); float lastFloat = mySharedPreferences.getFloat("lastFloat", 0f); int wholeNumber = mySharedPreferences.getInt("wholeNumber", 1); long aNumber = mySharedPreferences.getLong("aNumber", 0); String stringPreference = mySharedPreferences.getString("textEntryValue", "");... SharedPreferences.Editor editor = mySharedPreferences.edit(); // Store new primitive types in the shared preferences object. editor.putBoolean("isTrue", true); editor.putFloat("lastFloat", 1f); editor.putInt("wholeNumber", 2); editor.putLong("aNumber", 3l); editor.putString("textEntryValue", "Not Empty"); // Commit the changes. editor.commit();

PreferenceScreen Новосибирский государственный университет, 2012 Лекция 4, слайд 30

Работа с PreferenceActivity Новосибирский государственный университет, 2012 Лекция 4, слайд 31 public class MySettings extends PreferenceActivity { SharedPreferences protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); prefs = this.getSharedPreferences("MySettings", Activity.MODE_PRIVATE); } ... Intent i = new intent(this, MySettings.class); startActivityForResult(i, SHOW_PREFERENCES);

Работа с общими настройками Новосибирский государственный университет, 2012 Лекция 4, слайд 32 Context context = getApplicationContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); // TODO: use get methods public class MyActivity extends Activity implements OnSharedPreferenceChangeListener public void onCreate(Bundle SavedInstanceState) { // Register this OnSharedPreferenceChangeListener Context context = getApplicationContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.registerOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { // TODO Check the shared preference and key parameters and change UI or // behavior as appropriate. }

Пример PreferenceActivity Лекция 4, слайд 33 Новосибирский государственный университет, 2012

На следующей лекции Лекция 4, слайд 34 Новосибирский государственный университет, 2012 SQLite и источники данных Геокодирование & Карты Геолокационные сервисы

Задание «Записная книжка» Лекция 4, слайд 35 Новосибирский государственный университет, 2012 Разработать приложение с графическим пользовательским интерфейсом, поддерживающее cоздание, редактирование, удаление, поиск заметок. Два варианта хранения заметок: А) в базе SQLite; Б) с использованием файловой системы. Срок выполнения : 2 недели

Лекция 4, слайд 36 Новосибирский государственный университет, 2012