+ All Categories
Home > Technology > MFF Android 2 5.12.2012

MFF Android 2 5.12.2012

Date post: 24-Apr-2015
Category:
Upload: ondraz
View: 1,005 times
Download: 4 times
Share this document with a friend
Description:
2nd lecture of Mo
231
Android 2 Ondra Zahradník MFF - 5.12.2012 Wednesday, December 5, 2012
Transcript
Page 1: MFF Android 2 5.12.2012

Android 2Ondra ZahradníkMFF - 5.12.2012

Wednesday, December 5, 2012

Page 2: MFF Android 2 5.12.2012

Agenda

Wednesday, December 5, 2012

Page 3: MFF Android 2 5.12.2012

Agenda

1. Rekapitulace z minula

Wednesday, December 5, 2012

Page 4: MFF Android 2 5.12.2012

Agenda

1. Rekapitulace z minula

2. BroadcastReceiver

Wednesday, December 5, 2012

Page 5: MFF Android 2 5.12.2012

Agenda

1. Rekapitulace z minula

2. BroadcastReceiver

3. Podpora různých zařízení

Wednesday, December 5, 2012

Page 6: MFF Android 2 5.12.2012

Agenda

1. Rekapitulace z minula

2. BroadcastReceiver

3. Podpora různých zařízení

4. Dynamické UI pomocí fragmentů

Wednesday, December 5, 2012

Page 7: MFF Android 2 5.12.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

Page 8: MFF Android 2 5.12.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

Page 9: MFF Android 2 5.12.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

Page 10: MFF Android 2 5.12.2012

House-keeping notes

• slajdy - http://goo.gl/2siyO

• zdroje - http://goo.gl/HqMIs

• vaše otázky

Wednesday, December 5, 2012

Page 11: MFF Android 2 5.12.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

Page 12: MFF Android 2 5.12.2012

Broadcasty

Wednesday, December 5, 2012

Page 13: MFF Android 2 5.12.2012

Broadcasty

• Aplikace reaguje na důležité události

Wednesday, December 5, 2012

Page 14: MFF Android 2 5.12.2012

Broadcasty

• Aplikace reaguje na důležité události

• Boot, SMS, Call, připojení, čas...

Wednesday, December 5, 2012

Page 15: MFF Android 2 5.12.2012

Broadcasty

• Aplikace reaguje na důležité události

• Boot, SMS, Call, připojení, čas...

• BroadcastReceiver

Wednesday, December 5, 2012

Page 16: MFF Android 2 5.12.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

Page 17: MFF Android 2 5.12.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

Page 18: MFF Android 2 5.12.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

Page 19: MFF Android 2 5.12.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

Page 20: MFF Android 2 5.12.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

Page 21: MFF Android 2 5.12.2012

Příklad

Wednesday, December 5, 2012

Page 22: MFF Android 2 5.12.2012

Příklad

• Vypište číslo a text příchozí sms v toastu

Wednesday, December 5, 2012

Page 23: MFF Android 2 5.12.2012

Příklad

• Vypište číslo a text příchozí sms v toastu

• Toast - http://goo.gl/WoTk

Wednesday, December 5, 2012

Page 24: MFF Android 2 5.12.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

Page 25: MFF Android 2 5.12.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

Page 26: MFF Android 2 5.12.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

Page 27: MFF Android 2 5.12.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

Page 28: MFF Android 2 5.12.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

Page 29: MFF Android 2 5.12.2012

Zdroje a kvalifikátory

Wednesday, December 5, 2012

Page 30: MFF Android 2 5.12.2012

Zdroje a kvalifikátory

• Zdroje

Wednesday, December 5, 2012

Page 31: MFF Android 2 5.12.2012

Zdroje a kvalifikátory

• Zdroje

• texty, obrázky, layout, barvy,...

Wednesday, December 5, 2012

Page 32: MFF Android 2 5.12.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

Page 33: MFF Android 2 5.12.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

Page 34: MFF Android 2 5.12.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

Page 35: MFF Android 2 5.12.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

Page 36: MFF Android 2 5.12.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

Page 37: MFF Android 2 5.12.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

Page 38: MFF Android 2 5.12.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

Page 39: MFF Android 2 5.12.2012

Resource resolving

Wednesday, December 5, 2012

Page 40: MFF Android 2 5.12.2012

Resource resolving

Wednesday, December 5, 2012

Page 41: MFF Android 2 5.12.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

Page 42: MFF Android 2 5.12.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

Page 43: MFF Android 2 5.12.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

Page 44: MFF Android 2 5.12.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

Page 45: MFF Android 2 5.12.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

Page 46: MFF Android 2 5.12.2012

Různé obrazovky

Wednesday, December 5, 2012

Page 47: MFF Android 2 5.12.2012

• obrazovky small, normal, large, xlarge

Různé obrazovky

Wednesday, December 5, 2012

Page 48: MFF Android 2 5.12.2012

• obrazovky small, normal, large, xlarge

• wrap_content, match_parent • RelativeLayout

Různé obrazovky

Wednesday, December 5, 2012

Page 49: MFF Android 2 5.12.2012

• obrazovky small, normal, large, xlarge

• wrap_content, match_parent • RelativeLayout• 9-patch

Různé obrazovky

Wednesday, December 5, 2012

Page 50: MFF Android 2 5.12.2012

• obrazovky small, normal, large, xlarge

• wrap_content, match_parent • RelativeLayout• 9-patch

Různé obrazovky

Wednesday, December 5, 2012

Page 51: MFF Android 2 5.12.2012

• obrazovky small, normal, large, xlarge

• wrap_content, match_parent • RelativeLayout• 9-patch

Různé obrazovky

Wednesday, December 5, 2012

Page 52: MFF Android 2 5.12.2012

Různé hustoty

Wednesday, December 5, 2012

Page 53: MFF Android 2 5.12.2012

Různé hustoty

Wednesday, December 5, 2012

Page 54: MFF Android 2 5.12.2012

Různé hustoty

Wednesday, December 5, 2012

Page 55: MFF Android 2 5.12.2012

Různé hustoty

Wednesday, December 5, 2012

Page 56: MFF Android 2 5.12.2012

• hustoty ldpi, mdpi, hdpi, xhdpi

Různé hustoty

Wednesday, December 5, 2012

Page 57: MFF Android 2 5.12.2012

• hustoty ldpi, mdpi, hdpi, xhdpi

Různé hustoty

Wednesday, December 5, 2012

Page 58: MFF Android 2 5.12.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

Page 59: MFF Android 2 5.12.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

Page 60: MFF Android 2 5.12.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

Page 61: MFF Android 2 5.12.2012

Podpora různých verzí

Wednesday, December 5, 2012

Page 62: MFF Android 2 5.12.2012

Podpora různých verzí

• Na trhu Android v2.1 - v4.0.3

Wednesday, December 5, 2012

Page 63: MFF Android 2 5.12.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

Page 64: MFF Android 2 5.12.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

Page 65: MFF Android 2 5.12.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

Page 66: MFF Android 2 5.12.2012

Různá zařízení

Wednesday, December 5, 2012

Page 67: MFF Android 2 5.12.2012

Různá zařízení

• deklarativně podadresáři v /res

Wednesday, December 5, 2012

Page 68: MFF Android 2 5.12.2012

Různá zařízení

• deklarativně podadresáři v /res

• defaultní a alternativní

Wednesday, December 5, 2012

Page 69: MFF Android 2 5.12.2012

Různá zařízení

• deklarativně podadresáři v /res

• defaultní a alternativní

dvě zařízeníjeden layout

Wednesday, December 5, 2012

Page 70: MFF Android 2 5.12.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

Page 71: MFF Android 2 5.12.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

Page 72: MFF Android 2 5.12.2012

Fragment

Wednesday, December 5, 2012

Page 73: MFF Android 2 5.12.2012

Fragment

Wednesday, December 5, 2012

Page 74: MFF Android 2 5.12.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

Page 75: MFF Android 2 5.12.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

Page 76: MFF Android 2 5.12.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

Page 77: MFF Android 2 5.12.2012

Fragmenty na telefonu a tabletu

Wednesday, December 5, 2012

Page 78: MFF Android 2 5.12.2012

Fragmenty na telefonu a tabletu

Wednesday, December 5, 2012

Page 79: MFF Android 2 5.12.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

Page 80: MFF Android 2 5.12.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

Page 81: MFF Android 2 5.12.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

Page 82: MFF Android 2 5.12.2012

Komunikace mezi fragmenty

Wednesday, December 5, 2012

Page 83: MFF Android 2 5.12.2012

Komunikace mezi fragmenty

Wednesday, December 5, 2012

Page 84: MFF Android 2 5.12.2012

Komunikace mezi fragmenty

• FragmentA definuje Listener interface

Wednesday, December 5, 2012

Page 85: MFF Android 2 5.12.2012

Komunikace mezi fragmenty

• FragmentA definuje Listener interface

• Activity interface implementuje

Wednesday, December 5, 2012

Page 86: MFF Android 2 5.12.2012

Komunikace mezi fragmenty

• FragmentA definuje Listener interface

• Activity interface implementuje

• FragmentA volá callback onItemSelected(...)

Wednesday, December 5, 2012

Page 87: MFF Android 2 5.12.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

Page 88: MFF Android 2 5.12.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

Page 89: MFF Android 2 5.12.2012

Přestávka

Wednesday, December 5, 2012

Page 90: MFF Android 2 5.12.2012

Motivace -rychlé appky

Wednesday, December 5, 2012

Page 91: MFF Android 2 5.12.2012

Motivace -rychlé appky

• Nechceme čekat, když čekáme

Wednesday, December 5, 2012

Page 92: MFF Android 2 5.12.2012

Motivace -rychlé appky

• Nechceme čekat, když čekáme

• Chceme rychlé appky

Wednesday, December 5, 2012

Page 93: MFF Android 2 5.12.2012

Motivace -rychlé appky

• Nechceme čekat, když čekáme

• Chceme rychlé appky

1.síťovat, když se nikdo nedívá

Wednesday, December 5, 2012

Page 94: MFF Android 2 5.12.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

Page 95: MFF Android 2 5.12.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

Page 96: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 97: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 98: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 99: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 100: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 101: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 102: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 103: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 104: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 105: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 106: MFF Android 2 5.12.2012

Příklad - Corkbin pro iOS a Android

Wednesday, December 5, 2012

Page 107: MFF Android 2 5.12.2012

Omezený programovací model

Wednesday, December 5, 2012

Page 108: MFF Android 2 5.12.2012

Omezený programovací model

• Slabý procesor

Wednesday, December 5, 2012

Page 109: MFF Android 2 5.12.2012

Omezený programovací model

• Slabý procesor

• Opravdový multi-tasking

Wednesday, December 5, 2012

Page 110: MFF Android 2 5.12.2012

Omezený programovací model

• Slabý procesor

• Opravdový multi-tasking

• “Application not responding” aka. ANR

Wednesday, December 5, 2012

Page 111: MFF Android 2 5.12.2012

Omezený programovací model

• Slabý procesor

• Opravdový multi-tasking

• “Application not responding” aka. ANR

• Aktualizace UI pouze v ui threadu

Wednesday, December 5, 2012

Page 112: MFF Android 2 5.12.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

Page 113: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

Wednesday, December 5, 2012

Page 114: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

ListFragment

Wednesday, December 5, 2012

Page 115: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

ListFragment DBčte data

Wednesday, December 5, 2012

Page 116: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

ListFragment DBčte data

sql

Wednesday, December 5, 2012

Page 117: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

ListFragment DBčte data

sql

UI

Wednesday, December 5, 2012

Page 118: MFF Android 2 5.12.2012

Architektura typické aplikace 1

• Zobraz seznam položek z databáze

ListFragment DBčte data

sql

UI Model

Wednesday, December 5, 2012

Page 119: MFF Android 2 5.12.2012

Databáze

Wednesday, December 5, 2012

Page 120: MFF Android 2 5.12.2012

Databáze

• SQLite v3 databáze

Wednesday, December 5, 2012

Page 121: MFF Android 2 5.12.2012

Databáze

• SQLite v3 databáze

• SQLiteOpenHelper

Wednesday, December 5, 2012

Page 122: MFF Android 2 5.12.2012

Databáze

• SQLite v3 databáze

• SQLiteOpenHelper

• stará se o life-cycle databáze

Wednesday, December 5, 2012

Page 123: MFF Android 2 5.12.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

Page 124: MFF Android 2 5.12.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

Page 125: MFF Android 2 5.12.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

Page 126: MFF Android 2 5.12.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

Page 127: MFF Android 2 5.12.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

Page 128: MFF Android 2 5.12.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

Page 129: MFF Android 2 5.12.2012

Cursor

Wednesday, December 5, 2012

Page 130: MFF Android 2 5.12.2012

Cursor

• zpřístupňuje řádky výsledku db.query()

Wednesday, December 5, 2012

Page 131: MFF Android 2 5.12.2012

Cursor

• zpřístupňuje řádky výsledku db.query()

• metody pro pohyb

Wednesday, December 5, 2012

Page 132: MFF Android 2 5.12.2012

Cursor

• zpřístupňuje řádky výsledku db.query()

• metody pro pohyb• moveToFirst(), moveToNext(), getCount()

Wednesday, December 5, 2012

Page 133: MFF Android 2 5.12.2012

Cursor

• zpřístupňuje řádky výsledku db.query()

• metody pro pohyb• moveToFirst(), moveToNext(), getCount()

• metody pro čtení

Wednesday, December 5, 2012

Page 134: MFF Android 2 5.12.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

Page 135: MFF Android 2 5.12.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

Page 136: MFF Android 2 5.12.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

Page 137: MFF Android 2 5.12.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

Page 138: MFF Android 2 5.12.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

Page 139: MFF Android 2 5.12.2012

Architektura typické aplikace 2

• Zobraz seznam položek z databáze

Wednesday, December 5, 2012

Page 140: MFF Android 2 5.12.2012

Architektura typické aplikace 2

• Zobraz seznam položek z databáze

ListFragment

Wednesday, December 5, 2012

Page 141: MFF Android 2 5.12.2012

Architektura typické aplikace 2

• Zobraz seznam položek z databáze

ListFragment

ContentProvider

poskytuje data

Wednesday, December 5, 2012

Page 142: MFF Android 2 5.12.2012

Architektura typické aplikace 2

• Zobraz seznam položek z databáze

ListFragment

ContentProvider

poskytuje data uri

Wednesday, December 5, 2012

Page 143: MFF Android 2 5.12.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

Page 144: MFF Android 2 5.12.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

Page 145: MFF Android 2 5.12.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

Page 146: MFF Android 2 5.12.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

Page 147: MFF Android 2 5.12.2012

ContentProvider

Wednesday, December 5, 2012

Page 148: MFF Android 2 5.12.2012

ContentProvider

• Jednotné API pro přístup k modelu

Wednesday, December 5, 2012

Page 149: MFF Android 2 5.12.2012

ContentProvider

• Jednotné API pro přístup k modelu

• Zapouzdřuje CRUD operace nad databází

Wednesday, December 5, 2012

Page 150: MFF Android 2 5.12.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

Page 151: MFF Android 2 5.12.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

Page 152: MFF Android 2 5.12.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

Page 153: MFF Android 2 5.12.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

Page 154: MFF Android 2 5.12.2012

Architektura typické aplikace 3

• Zobraz seznam položek z databáze

Wednesday, December 5, 2012

Page 155: MFF Android 2 5.12.2012

Architektura typické aplikace 3

• Zobraz seznam položek z databáze

ListFragment

Wednesday, December 5, 2012

Page 156: MFF Android 2 5.12.2012

Architektura typické aplikace 3

• Zobraz seznam položek z databáze

ListFragment

CursorLoader

načítání dat

Wednesday, December 5, 2012

Page 157: MFF Android 2 5.12.2012

Architektura typické aplikace 3

• Zobraz seznam položek z databáze

ListFragment

CursorLoader

načítání dat callbacky

Wednesday, December 5, 2012

Page 158: MFF Android 2 5.12.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

Page 159: MFF Android 2 5.12.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

Page 160: MFF Android 2 5.12.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

Page 161: MFF Android 2 5.12.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

Page 162: MFF Android 2 5.12.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

Page 163: MFF Android 2 5.12.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

Page 164: MFF Android 2 5.12.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

Page 165: MFF Android 2 5.12.2012

Asynchroní operace

Wednesday, December 5, 2012

Page 166: MFF Android 2 5.12.2012

Asynchroní operace

• Omezený programovací model

Wednesday, December 5, 2012

Page 167: MFF Android 2 5.12.2012

Asynchroní operace

• Omezený programovací model• slabý procesor

Wednesday, December 5, 2012

Page 168: MFF Android 2 5.12.2012

Asynchroní operace

• Omezený programovací model• slabý procesor• multi-tasking

Wednesday, December 5, 2012

Page 169: MFF Android 2 5.12.2012

Asynchroní operace

• Omezený programovací model• slabý procesor• multi-tasking• aktualizace UI pouze v ui threadu

Wednesday, December 5, 2012

Page 170: MFF Android 2 5.12.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

Page 171: MFF Android 2 5.12.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

Page 172: MFF Android 2 5.12.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

Page 173: MFF Android 2 5.12.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

Page 174: MFF Android 2 5.12.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

Page 175: MFF Android 2 5.12.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

Page 176: MFF Android 2 5.12.2012

CursorLoader

Wednesday, December 5, 2012

Page 177: MFF Android 2 5.12.2012

CursorLoader

• Čte z ContentProvideru na pozadí

Wednesday, December 5, 2012

Page 178: MFF Android 2 5.12.2012

CursorLoader

• Čte z ContentProvideru na pozadí

• Activity/Fragment notifikováno callbackem• onCreateLoader()

• onLoadFinished()

• onLoadReset()

Wednesday, December 5, 2012

Page 179: MFF Android 2 5.12.2012

CursorLoader

• Čte z ContentProvideru na pozadí

• Activity/Fragment notifikováno callbackem• onCreateLoader()

• onLoadFinished()

• onLoadReset()

• Umí reusovat jednou nahraný Cursor

Wednesday, December 5, 2012

Page 180: MFF Android 2 5.12.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

Page 181: MFF Android 2 5.12.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

Page 182: MFF Android 2 5.12.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

Page 183: MFF Android 2 5.12.2012

Architektura typické aplikace 4

• Aktualizace z internetu

Wednesday, December 5, 2012

Page 184: MFF Android 2 5.12.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

Page 185: MFF Android 2 5.12.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

Page 186: MFF Android 2 5.12.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

Page 187: MFF Android 2 5.12.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

Page 188: MFF Android 2 5.12.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

Page 189: MFF Android 2 5.12.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

Page 190: MFF Android 2 5.12.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

Page 191: MFF Android 2 5.12.2012

IntentService

Wednesday, December 5, 2012

Page 192: MFF Android 2 5.12.2012

IntentService

• Implementuje frontu tasků za zpracovaní

Wednesday, December 5, 2012

Page 193: MFF Android 2 5.12.2012

IntentService

• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)

Wednesday, December 5, 2012

Page 194: MFF Android 2 5.12.2012

IntentService

• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)

• Impl. pomocí HandlerThread a Handler

Wednesday, December 5, 2012

Page 195: MFF Android 2 5.12.2012

IntentService

• Implementuje frontu tasků za zpracovaní• onHandleIntent(Intent i)

• Impl. pomocí HandlerThread a Handler

• Třeba definovat v manifestu

Wednesday, December 5, 2012

Page 196: MFF Android 2 5.12.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

Page 197: MFF Android 2 5.12.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

Page 198: MFF Android 2 5.12.2012

Síťování

Wednesday, December 5, 2012

Page 199: MFF Android 2 5.12.2012

Síťování

• Http Client, UrlConnection

Wednesday, December 5, 2012

Page 200: MFF Android 2 5.12.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

Page 201: MFF Android 2 5.12.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

Page 202: MFF Android 2 5.12.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

Page 203: MFF Android 2 5.12.2012

Parsování a db insert

Wednesday, December 5, 2012

Page 204: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray

Wednesday, December 5, 2012

Page 205: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()

Wednesday, December 5, 2012

Page 206: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()

• XML

Wednesday, December 5, 2012

Page 207: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()

• XML

• android.util.XML

Wednesday, December 5, 2012

Page 208: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()

• XML

• android.util.XML• android.sax.RootElement

Wednesday, December 5, 2012

Page 209: MFF Android 2 5.12.2012

Parsování a db insert

• JSON - JSONObject, JSONArray• getString(), getInt(), getDouble()

• XML

• android.util.XML• android.sax.RootElement

• ContentValues

Wednesday, December 5, 2012

Page 210: MFF Android 2 5.12.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

Page 211: MFF Android 2 5.12.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

Page 212: MFF Android 2 5.12.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

Page 213: MFF Android 2 5.12.2012

Architektura typické aplikace 5

• Operace create, update, delete

Wednesday, December 5, 2012

Page 214: MFF Android 2 5.12.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

Page 215: MFF Android 2 5.12.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

Page 216: MFF Android 2 5.12.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

Page 217: MFF Android 2 5.12.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

Page 218: MFF Android 2 5.12.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

Page 219: MFF Android 2 5.12.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

Page 220: MFF Android 2 5.12.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

Page 221: MFF Android 2 5.12.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

Page 222: MFF Android 2 5.12.2012

AsyncQueryHandler

Wednesday, December 5, 2012

Page 223: MFF Android 2 5.12.2012

AsyncQueryHandler

• Volá crud operace v threadu na pozadí

Wednesday, December 5, 2012

Page 224: MFF Android 2 5.12.2012

AsyncQueryHandler

• Volá crud operace v threadu na pozadí

• Zpětně notifikuje volajícího

Wednesday, December 5, 2012

Page 225: MFF Android 2 5.12.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

Page 226: MFF Android 2 5.12.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

Page 227: MFF Android 2 5.12.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

Page 228: MFF Android 2 5.12.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

Page 229: MFF Android 2 5.12.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

Page 230: MFF Android 2 5.12.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

Page 231: MFF Android 2 5.12.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


Recommended