Слайд 2
На прошлой лекции
Лекция 4, слайд 1
Новосибирский государственный университет,
2012
Views (GroupView, TextView, Spinner, EditView and etc.)
AbsoluteLayout, FrameLayout, LinearLayout,
TableLayout, RelativeLayout
Оптимизация разметки
Drawables & Menus
Слайд 3
Сегодня
Intents & Receivers
Broadcast messaging
Data Adapters
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, слайд 5
@Override
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
Стандартные действия
(часть)
Слайд 8
Лекция 4, слайд 7
Новосибирский государственный университет, 2012
Стандартные категории
(не все)
Слайд 9
Данные намерения
Новосибирский государственный университет, 2012
Лекция 4, слайд 8
Слайд 10
Утверждение намерений
Лекция 4, слайд 9
Новосибирский государственный университет, 2012
Слайд 11
Делегирование намерений
Лекция 4, слайд 10
Новосибирский государственный университет, 2012
Intent
intent = getIntent();
… //some code
startNextMatchingActivity(intent);
Слайд 12
Выбор контакта из списка (демо)
Лекция 4, слайд 11
Новосибирский
государственный университет, 2012
Слайд 13
Расширяемость меню
Лекция 4, слайд 12
Новосибирский государственный университет, 2012
android:name=".NostromoController">
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.EMAIL_ADDRESSES);
android:autoLink="phone|email"
/>
Определение через код:
Определение через 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, слайд 16
Новосибирский государственный университет,
2012
Через manifest.xml:
Через код:
IntentFilter
filter = new IntentFilter(NEW_LIFEFORM_DETECTED);
LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();
registerReceiver(r, filter);
…
unregisterReceiver(receiver);
Слайд 17
Оповещение о событиях
Лекция 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);
} } }
Слайд 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;
}
@Override
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
android:name=“android.permission.INTERNET”/>
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 в модальном режиме
android:name=“MyDialogActivity” android:theme=“@android:style/Theme.Dialog”>
Слайд 26
Управление диалогами
Новосибирский государственный университет, 2012
Лекция 4, слайд 25
static
final private int TIME_DIALOG = 1;
@Override
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;
}
@Override
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 that’s 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
xmlns:android="http://schemas.android.com/apk/res/android">
Слайд 32
Работа с PreferenceActivity
Новосибирский государственный университет, 2012
Лекция 4, слайд
31
public class MySettings extends PreferenceActivity {
SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
prefs = this.getSharedPreferences("MySettings",
Activity.MODE_PRIVATE);
}
android:label="My Settings">
...
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 {
@Override
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 недели