Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемЛюбовь Муравлева
1 Разработка мобильных приложений под Android Чиркунов Кирилл vk.com/chirkunov
2 На прошлой лекции Лекция 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
3 Сегодня Intents & Receivers Intents & Receivers Broadcast messaging Broadcast messaging Data Adapters Data Adapters Preferences & Settings & Files Preferences & Settings & Files Лекция 4, слайд 2 Новосибирский государственный университет, 2012
4 Намерения (Intents) Лекция 4, слайд 3 Новосибирский государственный университет, 2012 Применяются для: объявления о запуске Activity или Service, чтобы выполнить какие-либо действия на основе некоторых данных передачи уведомлений о том, что произошло событие явного запуска определенного Service или Activity
5 Код результата закрытия 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 и др.
6 Код результата закрытия 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; }
7 Лекция 4, слайд 6 Новосибирский государственный университет, 2012 Стандартные действия (часть) ACTION_VIEWACTION_SENDACTION_MAIN ACTION_DIALACTION_SENDTO ACTION_CALL ACTION_EDITACTION_ANSWER ACTION_WEB_SEARCH ACTION_SEARCHACTION_INSERT ACTION_DELETE
8 Лекция 4, слайд 7 Новосибирский государственный университет, 2012 Стандартные категории (не все) CATEGORY_DEFAULTCATEGORY_SELECTED_ALTERNATIVE CATEGORY_BROWSABLECATEGORY_LAUNCHER CATEGORY_GADGETCATEGORY_HOME CATEGORY_ALTERNATIVECATEGORY_PREFERENCE
9 Данные намерения Новосибирский государственный университет, 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
10 Утверждение намерений Лекция 4, слайд 9 Новосибирский государственный университет, 2012 Система собирает список всех доступных Intent-Filters из установленных пакетов Фильтры, которые не соответствуют действию или категории Intent, удаляются Каждая часть пути URI из намерения сравнивается с разделом data фильтра Intent-Filter Когда есть несколько совпадений, пользователю предлагается выбрать Activity из списка
11 Делегирование намерений Лекция 4, слайд 10 Новосибирский государственный университет, 2012 Intent intent = getIntent(); … //some code startNextMatchingActivity(intent);
12 Выбор контакта из списка (демо) Лекция 4, слайд 11 Новосибирский государственный университет, 2012
13 Расширяемость меню Лекция 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; }
14 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/");
15 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());
16 Оповещение о событиях Лекция 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); } } }
17 Регистрация широковещательного приемника Лекция 4, слайд 16 Новосибирский государственный университет, 2012 Через manifest.xml: Через код: IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED); LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver(); registerReceiver(r, filter); … unregisterReceiver(receiver);
18 Продвинутое оповещение Упорядоченное оповещение: sendOrderedBroadcast(intent, null) sendOrderedBroadcast(intent, null, myBroadcastReceiver, null, Activity.RESULT_OK, null, null); «Липкие» трансляции (требуется полномочие BROADCAST_STICKY) sendStickyBroadcast removeStickyBroadcast Лекция 4, слайд 17 Новосибирский государственный университет, 2012
19 Ожидающие намерения (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);
20 Адаптеры Интерфейс Adapter Наследники: ArrayAdapter SimpleCursorAdapter BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SpinnerAdapter, WrapperListAdapter Пользовательские адаптеры поддерживающие привязку к представлениям, наследникам абстрактного класса AdapterView Лекция 4, слайд 19 Новосибирский государственный университет, 2012
21 Адаптеры (пример) 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
22 Использование адаптеров Лекция 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);
23 Использование адаптеров Лекция 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);
24 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) { }
25 Лекция 4, слайд 24 Новосибирский государственный университет, 2012 Диалоговые окна Класс Dialog и его производные Специальные диалоговые окна: AlertDialog CharacterPickerDialog DatePickerDialog TimePickerDialog ProgressDialog Activity в модальном режиме
26 Управление диалогами Новосибирский государственный университет, 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; }
27 Просмотр данных о землетрясениях (демо) Новосибирский государственный университет, 2012 Лекция 4, слайд 26
28 Работа с файлами Новосибирский государственный университет, 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)
29 Настройки Новосибирский государственный университет, 2012 Лекция 4, слайд 28 Общие (SharedPreferences) Состояние приложения/активности (Bundle) Поддерживаемые типы: boolean string float long integer
30 Общие настройки Новосибирский государственный университет, 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();
31 PreferenceScreen Новосибирский государственный университет, 2012 Лекция 4, слайд 30
32 Работа с 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);
33 Работа с общими настройками Новосибирский государственный университет, 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. }
34 Пример PreferenceActivity Лекция 4, слайд 33 Новосибирский государственный университет, 2012
35 На следующей лекции Лекция 4, слайд 34 Новосибирский государственный университет, 2012 SQLite и источники данных Геокодирование & Карты Геолокационные сервисы
36 Задание «Записная книжка» Лекция 4, слайд 35 Новосибирский государственный университет, 2012 Разработать приложение с графическим пользовательским интерфейсом, поддерживающее cоздание, редактирование, удаление, поиск заметок. Два варианта хранения заметок: А) в базе SQLite; Б) с использованием файловой системы. Срок выполнения : 2 недели
37 Лекция 4, слайд 36 Новосибирский государственный университет, 2012
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.