3. Agenda
1. Rekapitulace z minula
Wednesday, December 5, 2012
4. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
Wednesday, December 5, 2012
5. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
Wednesday, December 5, 2012
6. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
4. Dynamické UI pomocí fragmentů
Wednesday, December 5, 2012
7. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
4. Dynamické UI pomocí fragmentů
5. Přestávka
Wednesday, December 5, 2012
8. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
4. Dynamické UI pomocí fragmentů
5. Přestávka
6. Architektura typické aplikace
Wednesday, December 5, 2012
9. Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
4. Dynamické UI pomocí fragmentů
5. Přestávka
6. Architektura typické aplikace
7. Otázky a odpovědi
Wednesday, December 5, 2012
10. House-keeping notes
• slajdy - http://goo.gl/2siyO
• zdroje - http://goo.gl/HqMIs
• vaše otázky
Wednesday, December 5, 2012
11. Rekapitulace z minula
1. Android SDK
2. Eclipse + ADT
3. Emulátor / device
4. Založení nového projektu
5. Struktura Android projektu
6. Activity, layout, Intent = UI
7. Kompilace a spuštění
8. Debugging
Wednesday, December 5, 2012
13. Broadcasty
• Aplikace reaguje na důležité události
Wednesday, December 5, 2012
14. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
Wednesday, December 5, 2012
15. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
Wednesday, December 5, 2012
16. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
<receiver android:name=".SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Wednesday, December 5, 2012
17. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
<receiver android:name=".SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent i) {
//TODO do something
}
}
Wednesday, December 5, 2012
18. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
<receiver android:name=".SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent i) {
• Možno definovat vlastní
//TODO do something
}
}
Wednesday, December 5, 2012
19. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
<receiver android:name=".SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent i) {
• Možno definovat vlastní
//TODO do something
}
}
• globální
Wednesday, December 5, 2012
20. Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
<receiver android:name=".SMSReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent i) {
• Možno definovat vlastní
//TODO do something
}
}
• globální
• lokální - notifikační systém uvnitř appky, levné
Wednesday, December 5, 2012
22. Příklad
• Vypište číslo a text příchozí sms v toastu
Wednesday, December 5, 2012
23. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
Wednesday, December 5, 2012
24. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
Wednesday, December 5, 2012
25. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
• SMS Intent - extra “pdus” seznam smsek
Wednesday, December 5, 2012
26. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
• SMS Intent - extra “pdus” seznam smsek
• SmsMessage.createFromPdu
Wednesday, December 5, 2012
27. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
• SMS Intent - extra “pdus” seznam smsek
• SmsMessage.createFromPdu
• SMS lze posílat z DDMS do emulátoru
Wednesday, December 5, 2012
28. Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
• SMS Intent - extra “pdus” seznam smsek
• SmsMessage.createFromPdu
• SMS lze posílat z DDMS do emulátoru
• zdrojáky - mff-android-hello
Wednesday, December 5, 2012
63. Podpora různých verzí
• Na trhu Android v2.1 - v4.0.3
• Nastavit minSdkVersion a targetSdkVersion
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
...
</manifest>
Wednesday, December 5, 2012
64. Podpora různých verzí
• Na trhu Android v2.1 - v4.0.3
• Nastavit minSdkVersion a targetSdkVersion
• Kontrolovat verzi API
private void setUpActionBar() {
// Make sure we're running on Honeycomb or higher to use ActionBar
APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
Wednesday, December 5, 2012
65. Příklad
• Rozšiřte příklad jednoduché kalkulačky o
podporu češtiny a landscape režimu
• zdrojáky, ze kterých lze vyjít
• mff-android-hello
• dokumentace
• http://goo.gl/RKihT
Wednesday, December 5, 2012
67. Různá zařízení
• deklarativně podadresáři v /res
Wednesday, December 5, 2012
68. Různá zařízení
• deklarativně podadresáři v /res
• defaultní a alternativní
Wednesday, December 5, 2012
69. Různá zařízení
• deklarativně podadresáři v /res
• defaultní a alternativní
dvě zařízení
jeden layout
Wednesday, December 5, 2012
70. Různá zařízení
• deklarativně podadresáři v /res
• defaultní a alternativní
dvě zařízení
jeden layout
jedno zařízení
dva layouty
Wednesday, December 5, 2012
71. Dynamické UI pomocí fragmentů
• Fragment je kus funkčního UI
• Aktivita hostí fragmenty
• Jedna aplikace pro telefon i tablet
Wednesday, December 5, 2012
74. Fragment
Fragment a jeho UI
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
Wednesday, December 5, 2012
75. Fragment
Fragment a jeho UI
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
Layout
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
Wednesday, December 5, 2012
76. Fragment
Fragment a jeho UI
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
Layout
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
Instance
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
}
}
Wednesday, December 5, 2012
79. Fragmenty na telefonu a tabletu
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frags">
<!-- "Fragment A" -->
<fragment class="com.example.android.TitlesFragment"
android:id="@+id/list_frag"
android:layout_width="@dimen/titles_size"
android:layout_height="match_parent"/>
<!-- "Fragment B" -->
<fragment class="com.example.android.DetailsFragment"
android:id="@+id/details_frag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Wednesday, December 5, 2012
80. Fragmenty na telefonu a tabletu
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- "Fragment A" -->
<fragment class="com.example.android.TitlesFragment"
android:id="@+id/list_frag"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
Wednesday, December 5, 2012
81. Fragmenty na telefonu a tabletu
public class MainActivity extends Activity implements TitlesFragment.OnItemSelectedListener {
public void onItemSelected(int position) {
DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
.findFragmentById(R.id.display_frag);
if (displayFrag == null) {
// DisplayFragment (Fragment B) is not in the layout (handset layout),
// so start DisplayActivity (Activity B)
// and pass it the info about the selected item
Intent intent = new Intent(this, DisplayActivity.class);
intent.putExtra("position", position);
startActivity(intent);
} else {
// DisplayFragment (Fragment B) is in the layout (tablet layout),
// so tell the fragment to update
displayFrag.updateContent(position);
}
}
}
Wednesday, December 5, 2012
85. Komunikace mezi fragmenty
• FragmentA definuje Listener interface
• Activity interface implementuje
Wednesday, December 5, 2012
86. Komunikace mezi fragmenty
• FragmentA definuje Listener interface
• Activity interface implementuje
• FragmentA volá callback onItemSelected(...)
Wednesday, December 5, 2012
87. Nové API na starých Androidech
• support lib. zpřístupňuje nové api pro staré
devices
• Fragment, Loader
• ViewPager, accessibility, NotificationBuilder,...
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
...
• ActionBarSherlock
• Animations
Wednesday, December 5, 2012
88. Příklad
• do seznamu přidejte možnost změnit položku
• změnu potvrďte FragmentDialogem
• zdrojáky
• http://goo.gl/NmK4o
• dokumentace
• http://goo.gl/tuZwX
• http://goo.gl/bK5GQ
Wednesday, December 5, 2012
92. Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
Wednesday, December 5, 2012
93. Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
1.síťovat, když se nikdo nedívá
Wednesday, December 5, 2012
94. Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
1.síťovat, když se nikdo nedívá
2.provádět akce okamžitě
Wednesday, December 5, 2012
95. Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
1.síťovat, když se nikdo nedívá
2.provádět akce okamžitě
3.prioritizovat tasky
Wednesday, December 5, 2012
110. Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
• “Application not responding” aka. ANR
Wednesday, December 5, 2012
111. Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
• “Application not responding” aka. ANR
• Aktualizace UI pouze v ui threadu
Wednesday, December 5, 2012
112. Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
• “Application not responding” aka. ANR
• Aktualizace UI pouze v ui threadu
• UI žije jenom chvíli
Wednesday, December 5, 2012
122. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
Wednesday, December 5, 2012
123. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
Wednesday, December 5, 2012
124. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
• onCreate() a onUpgrade()
Wednesday, December 5, 2012
125. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
• onCreate() a onUpgrade()
• zpřístupňuje interface databáze
Wednesday, December 5, 2012
126. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
• onCreate() a onUpgrade()
• zpřístupňuje interface databáze
• getWritableDatabase()
Wednesday, December 5, 2012
127. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
• onCreate() a onUpgrade()
• zpřístupňuje interface databáze
• getWritableDatabase()
• db.query(), db.insert (), db.update (), db.delete ()
Wednesday, December 5, 2012
128. Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
• onCreate() a onUpgrade()
• zpřístupňuje interface databáze
• getWritableDatabase()
• db.query(), db.insert (), db.update (), db.delete ()
• db.beginTransaction(), db.setTransactionSuccessful(),
db.endTransaction()
Wednesday, December 5, 2012
131. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
Wednesday, December 5, 2012
132. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
Wednesday, December 5, 2012
133. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
Wednesday, December 5, 2012
134. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
• getColumnIndex(String columnName)
Wednesday, December 5, 2012
135. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
• getColumnIndex(String columnName)
• getString(int columnIndex), ...
Wednesday, December 5, 2012
136. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
• getColumnIndex(String columnName)
• getString(int columnIndex), ...
• db.query(table, columns, selection, selectionArgs,........)
Wednesday, December 5, 2012
137. Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
• getColumnIndex(String columnName)
• getString(int columnIndex), ...
• db.query(table, columns, selection, selectionArgs,........)
• SimpleCursorAdapter, CursorAdapter
Wednesday, December 5, 2012
138. Příklad
1. prozkoumejte DatabaseHelper
2. v MainFragment zobrazte seznam knizek v DB
1. hint: použijte Cursor a SimpleCursorAdapter
• zdrojáky
• mff-android-1
• dokumentace
• http://goo.gl/eme2a
Wednesday, December 5, 2012
141. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
poskytuje data
ContentProvider
Wednesday, December 5, 2012
142. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
poskytuje data uri
ContentProvider
Wednesday, December 5, 2012
143. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
144. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
UI
ListFragment
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
145. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
UI
ListFragment
poskytuje data uri Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
146. Architektura typické aplikace 2
• Zobraz seznam položek z databáze
UI
ListFragment
poskytuje data uri Model
čte data
ContentProvider DB
sql
Boilerplate
Wednesday, December 5, 2012
148. ContentProvider
• Jednotné API pro přístup k modelu
Wednesday, December 5, 2012
149. ContentProvider
• Jednotné API pro přístup k modelu
• Zapouzdřuje CRUD operace nad databází
Wednesday, December 5, 2012
150. ContentProvider
• Jednotné API pro přístup k modelu
• Zapouzdřuje CRUD operace nad databází
• REST-like api a systém URI
Wednesday, December 5, 2012
151. ContentProvider
• Jednotné API pro přístup k modelu
• Zapouzdřuje CRUD operace nad databází
• REST-like api a systém URI
• Řeší synchronizaci
Wednesday, December 5, 2012
152. ContentProvider
• Jednotné API pro přístup k modelu
• Zapouzdřuje CRUD operace nad databází
• REST-like api a systém URI
• Řeší synchronizaci
• Poskytuje data jiným aplikacím
Wednesday, December 5, 2012
153. Příklad
1. prozkoumejte komunikaci provideru a databáze
2. v Provider naimplementujte query operaci
3. v MainFragment načtěte data přes provider
• zdrojáky
• mff-android-2
• dokumentace
• http://goo.gl/EFKK7
Wednesday, December 5, 2012
156. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat
CursorLoader
Wednesday, December 5, 2012
157. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat callbacky
CursorLoader
Wednesday, December 5, 2012
158. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data
ContentProvider
Wednesday, December 5, 2012
159. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
ContentProvider
Wednesday, December 5, 2012
160. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
Wednesday, December 5, 2012
161. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
162. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
163. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
164. Architektura typické aplikace 3
• Zobraz seznam položek z databáze
UI
ListFragment
načítání dat callbacky
Boilerplate
CursorLoader
poskytuje data uri Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
166. Asynchroní operace
• Omezený programovací model
Wednesday, December 5, 2012
167. Asynchroní operace
• Omezený programovací model
• slabý procesor
Wednesday, December 5, 2012
168. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
Wednesday, December 5, 2012
169. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
Wednesday, December 5, 2012
170. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
Wednesday, December 5, 2012
171. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
• UI žije jenom chvíli
Wednesday, December 5, 2012
172. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
• UI žije jenom chvíli
• Vše, co může dlouho trvat, mimo ui thread
Wednesday, December 5, 2012
173. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
• UI žije jenom chvíli
• Vše, co může dlouho trvat, mimo ui thread
• síťová komunikace
Wednesday, December 5, 2012
174. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
• UI žije jenom chvíli
• Vše, co může dlouho trvat, mimo ui thread
• síťová komunikace
• čtení z databáze
Wednesday, December 5, 2012
175. Asynchroní operace
• Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
• UI žije jenom chvíli
• Vše, co může dlouho trvat, mimo ui thread
• síťová komunikace
• čtení z databáze
• čtení z filesystému
Wednesday, December 5, 2012
177. CursorLoader
• Čte z ContentProvideru na pozadí
Wednesday, December 5, 2012
178. CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
Wednesday, December 5, 2012
179. CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
• Umí reusovat jednou nahraný Cursor
Wednesday, December 5, 2012
180. CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
• Umí reusovat jednou nahraný Cursor
• Obnoví Cursor při updatu modelu
Wednesday, December 5, 2012
181. CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
• Umí reusovat jednou nahraný Cursor
• Obnoví Cursor při updatu modelu
• Je třeba volat v jako
onActivityCreated()
().getSupportLoaderManager().initLoader()
getActivity
Wednesday, December 5, 2012
184. Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
185. Architektura typické aplikace 4
• Aktualizace z internetu
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
186. Architektura typické aplikace 4
• Aktualizace z internetu
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
187. Architektura typické aplikace 4
• Aktualizace z internetu
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri Čtení Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
188. Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment IntentService
Intent
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
189. Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment IntentService
Intent
provede
načítání dat callbacky síťování
CursorLoader
poskytuje data uri zapisuje sql, CV
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
190. Architektura typické aplikace 4
• Aktualizace z internetu Aktualizace
ListFragment IntentService
Intent
provede
načítání dat callbacky síťování
CursorLoader
poskytuje data uri zapisuje sql, CV
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
192. IntentService
• Implementuje frontu tasků za zpracovaní
Wednesday, December 5, 2012
193. IntentService
• Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
Wednesday, December 5, 2012
194. IntentService
• Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
Wednesday, December 5, 2012
195. IntentService
• Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
• Třeba definovat v manifestu
Wednesday, December 5, 2012
196. IntentService
• Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
• Třeba definovat v manifestu
• Volání přes Context.startService()
Wednesday, December 5, 2012
197. IntentService
• Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
• Třeba definovat v manifestu
• Volání přes Context.startService()
final Intent i = new Intent(getActivity(), MyService.class);
getActivity().startService(i);
Wednesday, December 5, 2012
214. Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
215. Architektura typické aplikace 5
• Operace create, update, delete
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
216. Architektura typické aplikace 5
• Operace create, update, delete
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
217. Architektura typické aplikace 5
• Operace create, update, delete
UI
ListFragment
načítání dat callbacky
CursorLoader
poskytuje data uri Čtení Model
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
218. Architektura typické aplikace 5
• Operace create, update, delete
čte data
ListFragment AsyncQueryHandler
uri,
CV
načítání dat callbacky
CursorLoader
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
219. Architektura typické aplikace 5
• Operace create, update, delete
čte data
ListFragment AsyncQueryHandler
uri,
CV
načítání dat callbacky provede c, u, d uri, CV
CursorLoader ContentProvider
poskytuje data uri
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
220. Architektura typické aplikace 5
• Operace create, update, delete
čte data
ListFragment AsyncQueryHandler
uri,
CV
načítání dat callbacky provede c, u, d uri, CV
CursorLoader ContentProvider
poskytuje data uri zapisuje sql, CV
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
221. Architektura typické aplikace 5
• Operace create, update, delete Zápis
čte data
ListFragment AsyncQueryHandler
uri,
CV
načítání dat callbacky provede c, u, d uri, CV
CursorLoader ContentProvider
poskytuje data uri zapisuje sql, CV
čte data
ContentProvider DB
sql
Wednesday, December 5, 2012
223. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
Wednesday, December 5, 2012
224. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
Wednesday, December 5, 2012
225. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
• Problém - volající nemusí již existovat
Wednesday, December 5, 2012
226. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
• Problém - volající nemusí již existovat
• Řešení
Wednesday, December 5, 2012
227. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
• Problém - volající nemusí již existovat
• Řešení
• Implementovat jako inner-static nebo top-level
Wednesday, December 5, 2012
228. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
• Problém - volající nemusí již existovat
• Řešení
• Implementovat jako inner-static nebo top-level
• WeakReference pro odkaz na volajícího
Wednesday, December 5, 2012
229. AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
• Problém - volající nemusí již existovat
• Řešení
• Implementovat jako inner-static nebo top-level
• WeakReference pro odkaz na volajícího
private class MyQueryHandler extends AsyncQueryHandler {
// Use weak reference to avoid memoey leak
private WeakReference<MyActivity> mMyActivity;
public MyQueryHandler(Context context) {
super(context.getContentResolver());
mMyActivity = new WeakReference<MyActivity>((MyActivity) context);
}
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
MyActivity activity = mMyActivity.get();
if (activity != null && !activity.isFinishing()) {
...
}
}
Wednesday, December 5, 2012
230. Příklad
1. Doplňte c, u, d operace do provideru a fragmentu
• zdrojáky
• mff-android-5
• dokumentace
• http://goo.gl/BS1hr
Wednesday, December 5, 2012
231. Děkuji
@ondraz
ukázky kódu a obrázky pocházejí z http://developer.android.com pod
licencemi Apache v2.0 a Creative Commons Attribution v2.5
Wednesday, December 5, 2012