MFF Android 2 5.12.2012

Post on 24-Apr-2015

1,005 views 4 download

description

2nd lecture of Mo

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