Содержание
-
Разработка мобильных приложений
Чиркунов Кирилл Лекция 4 cyril.chirkunov@computer.org vk.com/chirkunov Новосибирский национальный исследовательский государственный университет (НГУ)
-
На прошлой лекции
Лекция 4, слайд 1 Новосибирский государственный университет, 2012 Views (GroupView, TextView, Spinner, EditView and etc.) AbsoluteLayout, FrameLayout, LinearLayout, TableLayout, RelativeLayout Оптимизация разметки Drawables & Menus
-
Сегодня
Intents & Receivers Broadcast messaging Data Adapters Preferences & Settings & Files Лекция 4, слайд 2 Новосибирский государственный университет, 2012
-
Намерения (Intents)
Лекция 4, слайд 3 Новосибирский государственный университет, 2012 Применяются для: объявления о запуске Activity или Service, чтобы выполнить какие-либо действия на основе некоторых данных передачи уведомлений о том, что произошло событие явного запуска определенного Service или Activity
-
Код результата закрытия Activity
Лекция 4, слайд 4 Новосибирский государственный университет, 2012 Вызов из родительской активности: startActivityForResult(Intent i, intcall_Identificator) Выставление результата в дочерней активности: setResult(int result, Intent i) Коды возврата: Activity.RESULT_OK Activity.RESULT_CANCELED (по умолчанию) Другие, более специализированные: RESULT_FIRST_USER RESULT_COMMON_ERROR и др.
-
Лекция 4, слайд 5 @Override 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 horse = data.getData(); booleaninputCorrect = 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
-
Лекция 4, слайд 7 Новосибирский государственный университет, 2012 Стандартные категории (не все)
-
Данные намерения
Новосибирский государственный университет, 2012 Лекция 4, слайд 8
-
Утверждение намерений
Лекция 4, слайд 9 Новосибирский государственный университет, 2012
-
Делегирование намерений
Лекция 4, слайд 10 Новосибирский государственный университет, 2012 Intent intent = getIntent(); … //some code startNextMatchingActivity(intent);
-
Выбор контакта из списка (демо)
Лекция 4, слайд 11 Новосибирский государственный университет, 2012
-
Расширяемость меню
Лекция 4, слайд 12 Новосибирский государственный университет, 2012 public booleanonCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); Intent intent = new Intent(); intent.setData(MoonBaseProvider.CONTENT_URI); intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE); intmenuGroup = 0; intmenuItemId = 0; intmenuItemOrder = Menu.NONE; ComponentNamecaller = 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 TextViewtextView = (TextView) findViewById (R.id.myTextView); Linkify.addLinks (textView, Linkify.WEB_URLS|Linkify.EMAIL_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/");
-
LinkifyMatchModifier & TransformFilter
Лекция 4, слайд 14 Новосибирский государственный университет, 2012 class MyMatchFilter implements MatchFilter { public booleanacceptMatch(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, слайд 16 Новосибирский государственный университет, 2012 Через manifest.xml: Через код: IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED); LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver(); registerReceiver(r, filter); … unregisterReceiver(receiver);
-
Оповещение о событиях
Лекция 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 = "com.paad.alien.action.BURN_IT_WITH_FIRE"; @Override 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); } }}
-
Продвинутое оповещение
Упорядоченное оповещение: 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, intresource,List items) { super(context, resource, items); resource = _resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayoutnewView; MyClassclassInstance = 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; intlayoutID = 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}; SimpleCursorAdaptermyAdapter; 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}; SimpleCursorAdaptermyAdapter; myAdapter = new SimpleCursorAdapter(this, R.layout.simplecursorlayout, myCursor, fromColumns, toLayoutIDs); myListView.setAdapter(myAdapter);
-
Internetresources
Лекция 4, слайд 23 Новосибирский государственный университет, 2012 String myFeed = getString(R.string.my_feed); try { URL url = new URL(myFeed); URLConnection connection = url.openConnection(); HttpURLConnectionhttpConnection = (HttpURLConnection)connection; intresponseCode = 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 = 1; @Override public Dialog onCreateDialog(int id) { switch(id) { case (TIME_DIALOG) : AlertDialog.BuildertimeDialog = new AlertDialog.Builder(this); timeDialog.setTitle("The Current Time Is..."); timeDialog.setMessage("Now"); return timeDialog.create(); } return null; } @Override public void onPrepareDialog(int id, Dialog dialog) { switch(id) { case (TIME_DIALOG) : SimpleDateFormatsdf = new SimpleDateFormat("HH:mm:ss"); Date currentTime = new Date(java.lang.System.currentTimeMillis()); String dateString = sdf.format(currentTime); AlertDialogtimeDialog = (AlertDialog)dialog; timeDialog.setMessage(dateString); break; } }
-
Просмотр данных о землетрясениях (демо)
Новосибирский государственный университет, 2012 Лекция 4, слайд 26
-
Работа с файлами
Новосибирский государственный университет, 2012 Лекция 4, слайд 27 String FILE_NAME = "tempfile.tmp"; // Create a new output file stream that’s private to this application. FileOutputStreamfos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); // Create a new file input stream. FileInputStreamfis = openFileInput(FILE_NAME); Типы режимов доступа к файлам MODE_APPEND MODE_PRIVATE MODE_WORLD_READABLE MODE_WORLD_WRITEABLE Resources myResources = getResources(); InputStreammyFile = 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"; SharedPreferencesmySharedPreferences = getSharedPreferences(MY_PREFS, mode); // Retrieve the saved values. booleanisTrue = mySharedPreferences.getBoolean("isTrue", false); float lastFloat = mySharedPreferences.getFloat("lastFloat", 0f); intwholeNumber = 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 { SharedPreferencesprefs; @Override 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(); SharedPreferencesprefs = PreferenceManager.getDefaultSharedPreferences(context); // TODO: use get methods public class MyActivity extends Activity implements OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle SavedInstanceState) { // Register this OnSharedPreferenceChangeListener Context context = getApplicationContext(); SharedPreferencesprefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.registerOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferencesprefs, 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
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.