Post on 24-Apr-2015
description
transcript
Android 2Ondra ZahradníkMFF - 5.12.2012
Wednesday, December 5, 2012
Agenda
Wednesday, December 5, 2012
Agenda
1. Rekapitulace z minula
Wednesday, December 5, 2012
Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
Wednesday, December 5, 2012
Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
Wednesday, December 5, 2012
Agenda
1. Rekapitulace z minula
2. BroadcastReceiver
3. Podpora různých zařízení
4. Dynamické UI pomocí fragmentů
Wednesday, December 5, 2012
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
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
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
House-keeping notes
• slajdy - http://goo.gl/2siyO
• zdroje - http://goo.gl/HqMIs
• vaše otázky
Wednesday, December 5, 2012
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
Broadcasty
Wednesday, December 5, 2012
Broadcasty
• Aplikace reaguje na důležité události
Wednesday, December 5, 2012
Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
Wednesday, December 5, 2012
Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
Wednesday, December 5, 2012
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
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
Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
• Možno definovat vlastní
<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
Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
• Možno definovat vlastní
• globální
<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
Broadcasty
• Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
• BroadcastReceiver
• Možno definovat vlastní
• globální• lokální - notifikační systém uvnitř appky, levné
<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
Příklad
Wednesday, December 5, 2012
Příklad
• Vypište číslo a text příchozí sms v toastu
Wednesday, December 5, 2012
Příklad
• Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
Wednesday, December 5, 2012
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
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
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
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
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
Zdroje a kvalifikátory
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
• nejmenší šířka (sw720dp)
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
• nejmenší šířka (sw720dp)
• velikost obrazovky (small, normal, large, xlarge)
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
• nejmenší šířka (sw720dp)
• velikost obrazovky (small, normal, large, xlarge)
• orientace (land, port)
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
• nejmenší šířka (sw720dp)
• velikost obrazovky (small, normal, large, xlarge)
• orientace (land, port)
• hustota (ldpi, mdpi, hdpi, xhdpi)
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
Wednesday, December 5, 2012
Zdroje a kvalifikátory
• Zdroje
• texty, obrázky, layout, barvy,...
• Kvalifikátory• jazyk (en_rUS, cs, ...)
• nejmenší šířka (sw720dp)
• velikost obrazovky (small, normal, large, xlarge)
• orientace (land, port)
• hustota (ldpi, mdpi, hdpi, xhdpi)
• layout, layout-land, layout-land-v13
• drawable, drawable-hdpi, drawable-xhdpi
MyProject/ src/ MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml
res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png
Wednesday, December 5, 2012
Resource resolving
Wednesday, December 5, 2012
Resource resolving
Wednesday, December 5, 2012
Resource resolving
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Wednesday, December 5, 2012
Resource resolving
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key
Wednesday, December 5, 2012
Resource resolving
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Wednesday, December 5, 2012
Resource resolving
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
drawable/drawable-en/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Wednesday, December 5, 2012
Resource resolving
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
Locale = en-GB Screen orientation = port Screen pixel density = hdpi Touchscreen type = notouch Primary text input method = 12key
drawable/drawable-en/drawable-fr-rCA/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
drawable/drawable-en/drawable-en-port/drawable-en-notouch-12key/drawable-port-ldpi/drawable-port-notouch-12key/
drawable-en/drawable-en-port/drawable-en-notouch-12key/
Wednesday, December 5, 2012
Různé obrazovky
Wednesday, December 5, 2012
• obrazovky small, normal, large, xlarge
Různé obrazovky
Wednesday, December 5, 2012
• obrazovky small, normal, large, xlarge
• wrap_content, match_parent • RelativeLayout
Různé obrazovky
Wednesday, December 5, 2012
• obrazovky small, normal, large, xlarge
• wrap_content, match_parent • RelativeLayout• 9-patch
Různé obrazovky
Wednesday, December 5, 2012
• obrazovky small, normal, large, xlarge
• wrap_content, match_parent • RelativeLayout• 9-patch
Různé obrazovky
Wednesday, December 5, 2012
• obrazovky small, normal, large, xlarge
• wrap_content, match_parent • RelativeLayout• 9-patch
Různé obrazovky
Wednesday, December 5, 2012
Různé hustoty
Wednesday, December 5, 2012
Různé hustoty
Wednesday, December 5, 2012
Různé hustoty
Wednesday, December 5, 2012
Různé hustoty
Wednesday, December 5, 2012
• hustoty ldpi, mdpi, hdpi, xhdpi
Různé hustoty
Wednesday, December 5, 2012
• hustoty ldpi, mdpi, hdpi, xhdpi
Různé hustoty
Wednesday, December 5, 2012
• hustoty ldpi, mdpi, hdpi, xhdpi
Různé hustoty
• xhdpi: 2.0• hdpi: 1.5• mdpi: 1.0 (baseline)• ldpi: 0.75
Wednesday, December 5, 2012
• hustoty ldpi, mdpi, hdpi, xhdpi
Různé hustoty
• xhdpi: 2.0• hdpi: 1.5• mdpi: 1.0 (baseline)• ldpi: 0.75
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
Wednesday, December 5, 2012
• hustoty ldpi, mdpi, hdpi, xhdpi
• dp = density independent pixel
Různé hustoty
• xhdpi: 2.0• hdpi: 1.5• mdpi: 1.0 (baseline)• ldpi: 0.75
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
Wednesday, December 5, 2012
Podpora různých verzí
Wednesday, December 5, 2012
Podpora různých verzí
• Na trhu Android v2.1 - v4.0.3
Wednesday, December 5, 2012
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... > <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" /> ...</manifest>
Podpora různých verzí
• Na trhu Android v2.1 - v4.0.3
• Nastavit minSdkVersion a targetSdkVersion
Wednesday, December 5, 2012
Podpora různých verzí
• Na trhu Android v2.1 - v4.0.3
• Nastavit minSdkVersion a targetSdkVersion
• Kontrolovat verzi APIprivate 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
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
Různá zařízení
Wednesday, December 5, 2012
Různá zařízení
• deklarativně podadresáři v /res
Wednesday, December 5, 2012
Různá zařízení
• deklarativně podadresáři v /res
• defaultní a alternativní
Wednesday, December 5, 2012
Různá zařízení
• deklarativně podadresáři v /res
• defaultní a alternativní
dvě zařízeníjeden layout
Wednesday, December 5, 2012
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
Dynamické UI pomocí fragmentů
• Fragment je kus funkčního UI
• Aktivita hostí fragmenty
• Jedna aplikace pro telefon i tablet
Wednesday, December 5, 2012
Fragment
Wednesday, December 5, 2012
Fragment
Wednesday, December 5, 2012
Fragment
Fragment a jeho UIpublic 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
Fragment
Fragment a jeho UI
Layout
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); }}
<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
Fragment
Fragment a jeho UI
Layout
Instance
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); }}
<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" />
public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); }}
Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu
Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu
Wednesday, December 5, 2012
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
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
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
Komunikace mezi fragmenty
Wednesday, December 5, 2012
Komunikace mezi fragmenty
Wednesday, December 5, 2012
Komunikace mezi fragmenty
• FragmentA definuje Listener interface
Wednesday, December 5, 2012
Komunikace mezi fragmenty
• FragmentA definuje Listener interface
• Activity interface implementuje
Wednesday, December 5, 2012
Komunikace mezi fragmenty
• FragmentA definuje Listener interface
• Activity interface implementuje
• FragmentA volá callback onItemSelected(...)
Wednesday, December 5, 2012
Nové API na starých Androidech
• support lib. zpřístupňuje nové api pro staré devices
• Fragment, Loader
• ViewPager, accessibility, NotificationBuilder,...
• ActionBarSherlock
• Animations
import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;...
Wednesday, December 5, 2012
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
Přestávka
Wednesday, December 5, 2012
Motivace -rychlé appky
Wednesday, December 5, 2012
Motivace -rychlé appky
• Nechceme čekat, když čekáme
Wednesday, December 5, 2012
Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
Wednesday, December 5, 2012
Motivace -rychlé appky
• Nechceme čekat, když čekáme
• Chceme rychlé appky
1.síťovat, když se nikdo nedívá
Wednesday, December 5, 2012
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
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
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android
Wednesday, December 5, 2012
Omezený programovací model
Wednesday, December 5, 2012
Omezený programovací model
• Slabý procesor
Wednesday, December 5, 2012
Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
Wednesday, December 5, 2012
Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
• “Application not responding” aka. ANR
Wednesday, December 5, 2012
Omezený programovací model
• Slabý procesor
• Opravdový multi-tasking
• “Application not responding” aka. ANR
• Aktualizace UI pouze v ui threadu
Wednesday, December 5, 2012
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
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
Wednesday, December 5, 2012
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
ListFragment
Wednesday, December 5, 2012
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
ListFragment DBčte data
Wednesday, December 5, 2012
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
ListFragment DBčte data
sql
Wednesday, December 5, 2012
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
ListFragment DBčte data
sql
UI
Wednesday, December 5, 2012
Architektura typické aplikace 1
• Zobraz seznam položek z databáze
ListFragment DBčte data
sql
UI Model
Wednesday, December 5, 2012
Databáze
Wednesday, December 5, 2012
Databáze
• SQLite v3 databáze
Wednesday, December 5, 2012
Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
Wednesday, December 5, 2012
Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze
Wednesday, December 5, 2012
Databáze
• SQLite v3 databáze
• SQLiteOpenHelper
• stará se o life-cycle databáze• callbacky pro vytvoření a upgrade
Wednesday, December 5, 2012
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
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
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
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
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
Cursor
Wednesday, December 5, 2012
Cursor
• zpřístupňuje řádky výsledku db.query()
Wednesday, December 5, 2012
Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb
Wednesday, December 5, 2012
Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb• moveToFirst(), moveToNext(), getCount()
Wednesday, December 5, 2012
Cursor
• zpřístupňuje řádky výsledku db.query()
• metody pro pohyb• moveToFirst(), moveToNext(), getCount()
• metody pro čtení
Wednesday, December 5, 2012
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
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
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
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
Příklad
1. prozkoumejte DatabaseHelper2. 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
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data uri
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
DBčte data
uri
sql
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
DBčte data
uri
sql
UI
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
DBčte data
uri
sql
UI
Model
Wednesday, December 5, 2012
Architektura typické aplikace 2
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
DBčte data
uri
sql
UI
Model
Boilerplate
Wednesday, December 5, 2012
ContentProvider
Wednesday, December 5, 2012
ContentProvider
• Jednotné API pro přístup k modelu
Wednesday, December 5, 2012
ContentProvider
• Jednotné API pro přístup k modelu
• Zapouzdřuje CRUD operace nad databází
Wednesday, December 5, 2012
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
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
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
Příklad
1. prozkoumejte komunikaci provideru a databáze2. v Provider naimplementujte query operaci3. v MainFragment načtěte data přes provider
• zdrojáky
• mff-android-2
• dokumentace
• http://goo.gl/EFKK7
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
CursorLoader
načítání dat
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
CursorLoader
načítání dat callbacky
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat
DBčte data
callbacky
uri
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat
DBčte data
callbacky
uri
sql
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat
DBčte data
callbacky
uri
sql
UI
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat
DBčte data
callbacky
uri
sql
UI
Model
Wednesday, December 5, 2012
Architektura typické aplikace 3
• Zobraz seznam položek z databáze
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat
DBčte data
callbacky
uri
sql
UI
Model
Boilerplate
Wednesday, December 5, 2012
Asynchroní operace
Wednesday, December 5, 2012
Asynchroní operace
• Omezený programovací model
Wednesday, December 5, 2012
Asynchroní operace
• Omezený programovací model• slabý procesor
Wednesday, December 5, 2012
Asynchroní operace
• Omezený programovací model• slabý procesor• multi-tasking
Wednesday, December 5, 2012
Asynchroní operace
• Omezený programovací model• slabý procesor• multi-tasking• aktualizace UI pouze v ui threadu
Wednesday, December 5, 2012
Asynchroní operace
• Omezený programovací model• slabý procesor• multi-tasking• aktualizace UI pouze v ui threadu• Application not responding aka. ANR
Wednesday, December 5, 2012
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
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
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
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
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
CursorLoader
Wednesday, December 5, 2012
CursorLoader
• Čte z ContentProvideru na pozadí
Wednesday, December 5, 2012
CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem• onCreateLoader()
• onLoadFinished()
• onLoadReset()
Wednesday, December 5, 2012
CursorLoader
• Čte z ContentProvideru na pozadí
• Activity/Fragment notifikováno callbackem• onCreateLoader()
• onLoadFinished()
• onLoadReset()
• Umí reusovat jednou nahraný Cursor
Wednesday, December 5, 2012
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
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 onActivityCreated() jako getActivity().getSupportLoaderManager().initLoader()
Wednesday, December 5, 2012
Příklad
1. nahraďte volání provideru CursorLoaderem1. hint: fragment nechť implementuje
LoaderManager.LoaderCallbacks
2. hint: použijte getActivity().getContentResolver()
• zdrojáky
• mff-android-3
• dokumentace
• http://goo.gl/BBb2N
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
Model
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
ModelČtení
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
IntentServiceIntent
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
provede síťování
sql, CVzapisuje
IntentServiceIntent
Wednesday, December 5, 2012
Architektura typické aplikace 4
• Aktualizace z internetu
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
provede síťování
sql, CVzapisuje
IntentServiceIntent
Aktualizace
Wednesday, December 5, 2012
IntentService
Wednesday, December 5, 2012
IntentService
• Implementuje frontu tasků za zpracovaní
Wednesday, December 5, 2012
IntentService
• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)
Wednesday, December 5, 2012
IntentService
• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
Wednesday, December 5, 2012
IntentService
• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)
• Impl. pomocí HandlerThread a Handler
• Třeba definovat v manifestu
Wednesday, December 5, 2012
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
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
Síťování
Wednesday, December 5, 2012
Síťování
• Http Client, UrlConnection
Wednesday, December 5, 2012
Síťování
• Http Client, UrlConnection try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception }
Wednesday, December 5, 2012
Síťování
• Http Client, UrlConnection try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception }
Wednesday, December 5, 2012
Síťování
• Http Client, UrlConnection
• Oprávnění
• android.permission.INTERNET
try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception }
Wednesday, December 5, 2012
Parsování a db insert
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
• android.util.XML
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
• android.util.XML• android.sax.RootElement
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
• android.util.XML• android.sax.RootElement
• ContentValues
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
• android.util.XML• android.sax.RootElement
• ContentValues• db.insert()
Wednesday, December 5, 2012
Parsování a db insert
• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()
• XML
• android.util.XML• android.sax.RootElement
• ContentValues• db.insert()
• getContentResolver.notify(Uri,...)
Wednesday, December 5, 2012
Příklad
1. Přes RefreshService aktualizujte tabulku Books2. http://dl.dropbox.com/u/5296640/books.json
• zdrojáky
• mff-android-4
• dokumentace
• http://goo.gl/3Eee
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
Model
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
UI
ModelČtení
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
AsyncQueryHandleruri,CV
čte data
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
ContentProvider
provede c, u, d uri, CV
AsyncQueryHandleruri,CV
čte data
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
ContentProvider
provede c, u, d uri, CV
sql, CVzapisuje
AsyncQueryHandleruri,CV
čte data
Wednesday, December 5, 2012
Architektura typické aplikace 5
• Operace create, update, delete
ListFragment
ContentProvider
poskytuje data
CursorLoader
načítání dat callbacky
uri
DBčte data
sql
ContentProvider
provede c, u, d uri, CV
sql, CVzapisuje
AsyncQueryHandleruri,CV
čte data
Zápis
Wednesday, December 5, 2012
AsyncQueryHandler
Wednesday, December 5, 2012
AsyncQueryHandler
• Volá crud operace v threadu na pozadí
Wednesday, December 5, 2012
AsyncQueryHandler
• Volá crud operace v threadu na pozadí
• Zpětně notifikuje volajícího
Wednesday, December 5, 2012
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
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
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
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
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 leakprivate 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
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
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