SlideShare a Scribd company logo
1 of 205
Download to read offline
Android 2
                        Ondra Zahradník
                        MUNI - 18.5.2012




Tuesday, March 19, 13
Agenda




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
Agenda

           1.Rekapitulace z minula




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
Agenda

           1.Rekapitulace z minula
           2.BroadcastReceiver




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
Agenda

           1.Rekapitulace z minula
           2.BroadcastReceiver
           3.Podpora různých zařízení




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
Agenda

           1.Rekapitulace z minula
           2.BroadcastReceiver
           3.Podpora různých zařízení
           4.Dynamické UI pomocí fragmentů




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
Agenda

           1.Rekapitulace z minula
           2.BroadcastReceiver
           3.Podpora různých zařízení
           4.Dynamické UI pomocí fragmentů
           5.Přestávka




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
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




Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
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



Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
House-keeping notes

           •slajdy - http://goo.gl/QiFDy
           •zdroje - http://goo.gl/QH5J7
           •vaše otázky




Tuesday, March 19, 13
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

Tuesday, March 19, 13
Broadcasty




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

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




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

           •Aplikace reaguje na důležité události
               • Boot, SMS, Call, připojení, čas...




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

           •Aplikace reaguje na důležité události
               • Boot, SMS, Call, připojení, čas...
           •BroadcastReceiver




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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>




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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
                        	   }
                        }




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

           •Aplikace reaguje na důležité události
               • Boot, SMS, Call, připojení, čas...
           •BroadcastReceiver
                        <receiver android:name=".SMSReceiver">
                            <intent-filter >
                                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                            </intent-filter>
                        </receiver>
                                                                         public class SMSReceiver extends BroadcastReceiver {
                                                                         	   @Override
                                                                         	   public void onReceive(Context ctx, Intent i) {



           •Možno definovat vlastní
                                                                         	   	    //TODO do something
                                                                         	   }
                                                                         }




Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

           •Aplikace reaguje na důležité události
               • Boot, SMS, Call, připojení, čas...
           •BroadcastReceiver
                        <receiver android:name=".SMSReceiver">
                            <intent-filter >
                                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                            </intent-filter>
                        </receiver>
                                                                         public class SMSReceiver extends BroadcastReceiver {
                                                                         	   @Override
                                                                         	   public void onReceive(Context ctx, Intent i) {



           •Možno definovat vlastní
                                                                         	   	    //TODO do something
                                                                         	   }
                                                                         }



               • globální

Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Broadcasty

           •Aplikace reaguje na důležité události
               • Boot, SMS, Call, připojení, čas...
           •BroadcastReceiver
                        <receiver android:name=".SMSReceiver">
                            <intent-filter >
                                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                            </intent-filter>
                        </receiver>
                                                                         public class SMSReceiver extends BroadcastReceiver {
                                                                         	   @Override
                                                                         	   public void onReceive(Context ctx, Intent i) {



           •Možno definovat vlastní
                                                                         	   	    //TODO do something
                                                                         	   }
                                                                         }



               • globální
               • lokální - notifikační systém uvnitř appky,
                        levné
Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
Příklad




Tuesday, March 19, 13
Příklad

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




Tuesday, March 19, 13
Příklad

           •Vypište číslo a text příchozí sms v toastu
               • Toast - http://goo.gl/WoTk




Tuesday, March 19, 13
Příklad

           •Vypište číslo a text příchozí sms v toastu
               • Toast - http://goo.gl/WoTk
               • Oprávnění android.permission.RECEIVE_SMS




Tuesday, March 19, 13
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




Tuesday, March 19, 13
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




Tuesday, March 19, 13
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


Tuesday, March 19, 13
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 - muni-android-hello
Tuesday, March 19, 13
Různá zařízení




Tuesday, March 19, 13
Různá zařízení

           •deklarativně podadresáři v /res




Tuesday, March 19, 13
Různá zařízení

           •deklarativně podadresáři v /res
           •defaultní a alternativní




Tuesday, March 19, 13
Různá zařízení

           •deklarativně podadresáři v /res
           •defaultní a alternativní
                        dvě zařízení
                        jeden layout




Tuesday, March 19, 13
Různá zařízení

           •deklarativně podadresáři v /res
           •defaultní a alternativní
                        dvě zařízení
                        jeden layout



                        jedno zařízení
                        dva layouty


Tuesday, March 19, 13
Zdroje a kvalifikátory




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje




Tuesday, March 19, 13
Zdroje a kvalifikátory

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




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                               MyProject/
                                                     src/



               • texty, obrázky, layout, barvy,...
                                                          MyActivity.java
                                                     res/
                                                          drawable/
                                                              icon.png
                                                          layout/
                                                              main.xml
                                                              info.xml
                                                          values/
                                                              strings.xml




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                MyProject/
                                                      src/



               • texty, obrázky, layout, barvy,...
                                                           MyActivity.java
                                                      res/
                                                           drawable/
                                                               icon.png




           •Kvalifikátory
                                                           layout/
                                                               main.xml
                                                               info.xml
                                                           values/
                                                               strings.xml

               •        jazyk (en_rUS, cs, ...)




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                 MyProject/
                                                       src/



               • texty, obrázky, layout, barvy,...
                                                            MyActivity.java
                                                       res/
                                                            drawable/
                                                                icon.png




           •Kvalifikátory
                                                            layout/
                                                                main.xml
                                                                info.xml
                                                            values/
                                                                strings.xml

               •        jazyk (en_rUS, cs, ...)
               •        nejmenší šířka (sw720dp)




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                                MyProject/
                                                                      src/



               • texty, obrázky, layout, barvy,...
                                                                           MyActivity.java
                                                                      res/
                                                                           drawable/
                                                                               icon.png




           •Kvalifikátory
                                                                           layout/
                                                                               main.xml
                                                                               info.xml
                                                                           values/
                                                                               strings.xml

               •        jazyk (en_rUS, cs, ...)
               •        nejmenší šířka (sw720dp)
               •        velikost obrazovky (small, normal, large, xlarge)




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                                MyProject/
                                                                      src/



               • texty, obrázky, layout, barvy,...
                                                                           MyActivity.java
                                                                      res/
                                                                           drawable/
                                                                               icon.png




           •Kvalifikátory
                                                                           layout/
                                                                               main.xml
                                                                               info.xml
                                                                           values/
                                                                               strings.xml

               •        jazyk (en_rUS, cs, ...)
               •        nejmenší šířka (sw720dp)
               •        velikost obrazovky (small, normal, large, xlarge)
               •        orientace (land, port)




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                                MyProject/
                                                                      src/



               • texty, obrázky, layout, barvy,...
                                                                           MyActivity.java
                                                                      res/
                                                                           drawable/
                                                                               icon.png




           •Kvalifikátory
                                                                           layout/
                                                                               main.xml
                                                                               info.xml
                                                                           values/
                                                                               strings.xml

               •        jazyk (en_rUS, cs, ...)
               •        nejmenší šířka (sw720dp)
               •        velikost obrazovky (small, normal, large, xlarge)
               •        orientace (land, port)
               •        hustota (ldpi, mdpi, hdpi, xhdpi)




Tuesday, March 19, 13
Zdroje a kvalifikátory

           •Zdroje                                                MyProject/
                                                                      src/



               • texty, obrázky, layout, barvy,...
                                                                           MyActivity.java
                                                                      res/
                                                                           drawable/
                                                                               icon.png




           •Kvalifikátory
                                                                           layout/
                                                                               main.xml
                                                                               info.xml
                                                                           values/
                                                                               strings.xml

               •        jazyk (en_rUS, cs, ...)
               •        nejmenší šířka (sw720dp)
               •        velikost obrazovky (small, normal, large, xlarge)
               •        orientace (land, port)
               •        hustota (ldpi, mdpi, hdpi, xhdpi)
                                                                   res/

           •     layout, layout-land, layout-land-v13                     drawable/
                                                                              icon.png
                                                                              background.png

           • drawable,           drawable-hdpi, drawable-xhdpi
                                                                          drawable-hdpi/
                                                                              icon.png
                                                                              background.png




Tuesday, March 19, 13
Resource resolving




Tuesday, March 19, 13
Resource resolving




Tuesday, March 19, 13
Resource resolving
              drawable/
              drawable-en/
              drawable-fr-rCA/
              drawable-en-port/
              drawable-en-notouch-12key/
              drawable-port-ldpi/
              drawable-port-notouch-12key/




Tuesday, March 19, 13
Resource resolving
              drawable/
              drawable-en/
              drawable-fr-rCA/               Locale = en-GB
              drawable-en-port/              Screen orientation = port
              drawable-en-notouch-12key/     Screen pixel density = hdpi
              drawable-port-ldpi/            Touchscreen type = notouch
              drawable-port-notouch-12key/   Primary text input method = 12key




Tuesday, March 19, 13
Resource resolving
              drawable/
              drawable-en/
              drawable-fr-rCA/               Locale = en-GB
              drawable-en-port/              Screen orientation = port
              drawable-en-notouch-12key/     Screen pixel density = hdpi
              drawable-port-ldpi/            Touchscreen type = notouch
              drawable-port-notouch-12key/   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/




Tuesday, March 19, 13
Resource resolving
              drawable/
              drawable-en/
              drawable-fr-rCA/               Locale = en-GB
              drawable-en-port/              Screen orientation = port
              drawable-en-notouch-12key/     Screen pixel density = hdpi
              drawable-port-ldpi/            Touchscreen type = notouch
              drawable-port-notouch-12key/   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/




Tuesday, March 19, 13
Resource resolving
              drawable/
              drawable-en/
              drawable-fr-rCA/               Locale = en-GB
              drawable-en-port/              Screen orientation = port
              drawable-en-notouch-12key/     Screen pixel density = hdpi
              drawable-port-ldpi/            Touchscreen type = notouch
              drawable-port-notouch-12key/   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/




Tuesday, March 19, 13
Různé obrazovky




Tuesday, March 19, 13
Různé obrazovky

           •obrazovky small, normal, large, xlarge




Tuesday, March 19, 13
Různé obrazovky

           •obrazovky small, normal, large, xlarge
               • wrap_content, match_parent
               • RelativeLayout




Tuesday, March 19, 13
Různé obrazovky

           •obrazovky small, normal, large, xlarge
               • wrap_content, match_parent
               • RelativeLayout
               • 9-patch




Tuesday, March 19, 13
Různé obrazovky

           •obrazovky small, normal, large, xlarge
               • wrap_content, match_parent
               • RelativeLayout
               • 9-patch




Tuesday, March 19, 13
Různé obrazovky

           •obrazovky small, normal, large, xlarge
               • wrap_content, match_parent
               • RelativeLayout
               • 9-patch




Tuesday, March 19, 13
Různé hustoty




Tuesday, March 19, 13
Různé hustoty

           •hustoty ldpi, mdpi, hdpi, xhdpi




Tuesday, March 19, 13
Různé hustoty

           •hustoty ldpi, mdpi, hdpi, xhdpi




Tuesday, March 19, 13
Různé hustoty

           •hustoty ldpi, mdpi, hdpi, xhdpi
                •   xhdpi: 2.0
                •   hdpi: 1.5
                •   mdpi: 1.0 (baseline)
                •   ldpi: 0.75




Tuesday, March 19, 13
Různé hustoty

           •hustoty ldpi, mdpi, hdpi, xhdpi
                                           MyProject/
                                               res/
                                                    drawable-xhdpi/
                •   xhdpi: 2.0                          awesomeimage.png
                •   hdpi: 1.5                       drawable-hdpi/
                •   mdpi: 1.0 (baseline)                awesomeimage.png
                                                    drawable-mdpi/
                •   ldpi: 0.75                          awesomeimage.png
                                                    drawable-ldpi/
                                                        awesomeimage.png




Tuesday, March 19, 13
Různé hustoty

           •hustoty ldpi, mdpi, hdpi, xhdpi
                                           MyProject/
                                               res/
                                                    drawable-xhdpi/
                •   xhdpi: 2.0                          awesomeimage.png
                •   hdpi: 1.5                       drawable-hdpi/
                •   mdpi: 1.0 (baseline)                awesomeimage.png
                                                    drawable-mdpi/
                •   ldpi: 0.75                          awesomeimage.png
                                                    drawable-ldpi/
                                                        awesomeimage.png




           •dp = density independent pixel

Tuesday, March 19, 13
Podpora různých verzí




Tuesday, March 19, 13
Podpora různých verzí

           •Na trhu Android v2.1 - v4.0.3




Tuesday, March 19, 13
Podpora různých verzí

           •Na trhu Android v2.1 - v4.0.3
           •Nastavit minSdkVersion a targetSdkVersion
                        <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
                            <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
                            ...
                        </manifest>




Tuesday, March 19, 13
Podpora různých verzí

           •Na trhu Android v2.1 - v4.0.3
           •Nastavit minSdkVersion a targetSdkVersion
           •Kontrolovat verzi API
                        private void setUpActionBar() {
                            // Make sure we're running on Honeycomb or higher to use ActionBar
                        APIs
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                                ActionBar actionBar = getActionBar();
                                actionBar.setDisplayHomeAsUpEnabled(true);
                            }
                        }




Tuesday, March 19, 13
Příklad

           •Rozšiřte příklad kalkulačky z minulé
                 přednášky o podporu češtiny a landscape
                 režimu


           •zdrojáky, ze kterých lze vyjít
               • muni-android-hello
           •dokumentace
               • http://goo.gl/RKihT

Tuesday, March 19, 13
Dynamické UI pomocí fragmentů

           •Fragment je kus funkčního UI
           •Aktivita hostí fragmenty
           •Jedna aplikace pro telefon i tablet




Tuesday, March 19, 13
Fragment




Tuesday, March 19, 13
Fragment




Tuesday, March 19, 13
Fragment

       Fragment a jeho UI
        public class ArticleFragment extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                return inflater.inflate(R.layout.article_view, container, false);
            }
        }




Tuesday, March 19, 13
Fragment

       Fragment a jeho UI
        public class ArticleFragment extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                return inflater.inflate(R.layout.article_view, container, false);
            }
        }




       Layout
        <fragment       android:name="com.example.android.fragments.ArticleFragment"
                            android:id="@+id/article_fragment"
                            android:layout_weight="2"
                            android:layout_width="0dp"
                            android:layout_height="match_parent" />




Tuesday, March 19, 13
Fragment

       Fragment a jeho UI
        public class ArticleFragment extends Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                return inflater.inflate(R.layout.article_view, container, false);
            }
        }




       Layout
        <fragment       android:name="com.example.android.fragments.ArticleFragment"
                            android:id="@+id/article_fragment"
                            android:layout_weight="2"
                            android:layout_width="0dp"
                            android:layout_height="match_parent" />




       Instance
        public class MainActivity extends FragmentActivity {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.news_articles);
            }
        }




Tuesday, March 19, 13
Fragmenty na telefonu a tabletu




Tuesday, March 19, 13
Fragmenty na telefonu a tabletu




Tuesday, March 19, 13
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>


Tuesday, March 19, 13
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>




Tuesday, March 19, 13
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);
                                }
                            }
                        }


Tuesday, March 19, 13
Komunikace mezi fragmenty




Tuesday, March 19, 13
Komunikace mezi fragmenty




Tuesday, March 19, 13
Komunikace mezi fragmenty




           •FragmentA definuje Listener interface



Tuesday, March 19, 13
Komunikace mezi fragmenty




           •FragmentA definuje Listener interface
           •Activity interface implementuje


Tuesday, March 19, 13
Komunikace mezi fragmenty




           •FragmentA definuje Listener interface
           •Activity interface implementuje
           •FragmentA volá callback onItemSelected(...)

Tuesday, March 19, 13
Nové API na starých Androidech

           •support lib. zpřístupňuje nové api pro staré
                 devices

           •Fragment, Loader
           •ViewPager, accessibility,
                 NotificationBuilder,...
                 import android.support.v4.app.Fragment;
                 import android.support.v4.app.FragmentManager;
                 ...




           •ActionBarSherlock
           •Animations
Tuesday, March 19, 13
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
Tuesday, March 19, 13
Přestávka




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze


                        ListFragment




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze

                                       čte data
                        ListFragment              DB




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze

                                       čte data
                        ListFragment              DB
                                         sql




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze
                            UI
                                       čte data
                        ListFragment              DB
                                         sql




Tuesday, March 19, 13
Architektura typické aplikace 1

           •Zobraz seznam položek z databáze
                            UI                    Model
                                       čte data
                        ListFragment               DB
                                         sql




Tuesday, March 19, 13
Databáze




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Databáze

           •SQLite v3 databáze




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Databáze

           •SQLite v3 databáze
           •SQLiteOpenHelper




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Databáze

           •SQLite v3 databáze
           •SQLiteOpenHelper
               • stará se o life-cycle databáze




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Databáze

           •SQLite v3 databáze
           •SQLiteOpenHelper
               • stará se o life-cycle databáze
               • callbacky pro vytvoření a upgrade




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Databáze

           •SQLite v3 databáze
           •SQLiteOpenHelper
               • stará se o life-cycle databáze
               • callbacky pro vytvoření a upgrade
                    •   onCreate()   a   onUpgrade()




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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()




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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 ()




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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()




Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
Cursor




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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


           •metody pro pohyb




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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


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




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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


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


           •metody pro čtení




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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


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


           •metody pro čtení
               •        getColumnIndex(String columnName)




Tuesday, March 19, 13
optimalizovane dotazy do databaze
Cursor

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


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


           •metody pro čtení
               •        getColumnIndex(String columnName)
               •        getString(int columnIndex), ...




Tuesday, March 19, 13
optimalizovane dotazy do databaze
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,........)




Tuesday, March 19, 13
optimalizovane dotazy do databaze
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



Tuesday, March 19, 13
optimalizovane dotazy do databaze
Příklad

               1.prozkoumejte DatabaseHelper
               2.v MainFragment zobrazte seznam knizek v DB
                    1.hint: použijte Cursor a SimpleCursorAdapter



           •zdrojáky
               • muni-android-1
           •dokumentace
               • http://goo.gl/eme2a

Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                        ListFragment




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                         ListFragment

                 poskytuje
                   data


                        ContentProvider




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                         ListFragment

                 poskytuje
                                uri
                   data


                        ContentProvider




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                         ListFragment

                 poskytuje
                                uri
                   data

                                          čte data
                        ContentProvider              DB
                                             sql




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                                          UI
                         ListFragment

                 poskytuje
                                uri
                   data

                                          čte data
                        ContentProvider              DB
                                             sql




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                                          UI
                         ListFragment

                 poskytuje
                   data
                                uri                  Model
                                          čte data
                        ContentProvider               DB
                                             sql




Tuesday, March 19, 13
Architektura typické aplikace 2

           •Zobraz seznam položek z databáze
                                          UI
                         ListFragment

                 poskytuje
                   data
                                uri                  Model
                                          čte data
                        ContentProvider               DB
                                             sql


                    Boilerplate



Tuesday, March 19, 13
ContentProvider




Tuesday, March 19, 13
ContentProvider

           •Jednotné API pro přístup k modelu




Tuesday, March 19, 13
ContentProvider

           •Jednotné API pro přístup k modelu
           •Zapouzdřuje CRUD operace nad databází




Tuesday, March 19, 13
ContentProvider

           •Jednotné API pro přístup k modelu
           •Zapouzdřuje CRUD operace nad databází
           •REST-like api a systém URI




Tuesday, March 19, 13
ContentProvider

           •Jednotné API pro přístup k modelu
           •Zapouzdřuje CRUD operace nad databází
           •REST-like api a systém URI
           •Řeší synchronizaci




Tuesday, March 19, 13
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



Tuesday, March 19, 13
Příklad

               1.prozkoumejte komunikaci provideru a
                 databáze
               2.v Provider naimplementujte query operaci
               3.v MainFragment načtěte data přes provider



           •zdrojáky
               • muni-android-2
           •dokumentace
               • http://goo.gl/EFKK7
Tuesday, March 19, 13
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

               načítání dat


                        CursorLoader




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data


                    ContentProvider



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data


                    ContentProvider



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data
                               uri                   Model
                                          čte data
                    ContentProvider                   DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 3

           •Zobraz seznam položek z databáze
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                                          Boilerplate
                        CursorLoader

               poskytuje
                 data
                               uri                      Model
                                          čte data
                    ContentProvider                      DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Asynchroní operace




Tuesday, March 19, 13
Asynchroní operace

           •Omezený programovací model




Tuesday, March 19, 13
Asynchroní operace

           •Omezený programovací model
               • slabý procesor




Tuesday, March 19, 13
Asynchroní operace

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




Tuesday, March 19, 13
Asynchroní operace

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




Tuesday, March 19, 13
Asynchroní operace

           •Omezený programovací model
               • slabý procesor
               • multi-tasking
               • aktualizace UI pouze v ui threadu
               • Application not responding aka. ANR




Tuesday, March 19, 13
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




Tuesday, March 19, 13
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


Tuesday, March 19, 13
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


Tuesday, March 19, 13
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

Tuesday, March 19, 13
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
Tuesday, March 19, 13
CursorLoader




Tuesday, March 19, 13
CursorLoader

           •Čte z ContentProvideru na pozadí




Tuesday, March 19, 13
CursorLoader

           •Čte z ContentProvideru na pozadí
           •Activity/Fragment notifikováno callbackem
               •        onCreateLoader()
               •        onLoadFinished()
               •        onLoadReset()




Tuesday, March 19, 13
CursorLoader

           •Čte z ContentProvideru na pozadí
           •Activity/Fragment notifikováno callbackem
               •        onCreateLoader()
               •        onLoadFinished()
               •        onLoadReset()


           •Umí reusovat jednou nahraný Cursor



Tuesday, March 19, 13
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


Tuesday, March 19, 13
CursorLoader

           •Čte z ContentProvideru na pozadí
           •Activity/Fragment notifikováno callbackem
               •        onCreateLoader()
               •        onLoadFinished()
               •        onLoadReset()


           •Umí reusovat jednou nahraný Cursor
           •Obnoví Cursor při updatu modelu
           •Je třeba volat v            jako
                                      onActivityCreated()
                 getActivity().getSupportLoaderManager().initLoader()




Tuesday, March 19, 13
Příklad

               1.nahraďte volání provideru CursorLoaderem
                    1.hint: fragment nechť implementuje
                        LoaderManager.LoaderCallbacks

                    2.hint: použijte    getActivity().getContentResolver()




           •zdrojáky
               • muni-android-3
           •dokumentace
               • http://goo.gl/BBb2N

Tuesday, March 19, 13
Architektura typické aplikace 4

           •Aktualizace z internetu




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data
                               uri                        Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data
                               uri        Čtení           Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                        ListFragment        Inten
                                                     IntentService
                                              t
                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                       DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu
                        ListFragment        Inten
                                                        IntentService
                                              t
                               callback              provede
               načítání dat                          síťování
                                   y

                        CursorLoader

               poskytuje                                             sql,
                               uri                   zapisuje
                 data                                                CV

                                          čte data
                    ContentProvider                             DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 4

           •Aktualizace z internetu                              Aktualizace

                        ListFragment        Inten
                                                        IntentService
                                              t
                               callback              provede
               načítání dat                          síťování
                                   y

                        CursorLoader

               poskytuje                                             sql,
                               uri                   zapisuje
                 data                                                CV

                                          čte data
                    ContentProvider                             DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
IntentService




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
IntentService

           •Implementuje frontu tasků za zpracovaní




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
IntentService

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




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
IntentService

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


           •Impl. pomocí HandlerThread a Handler




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
IntentService

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


           •Impl. pomocí HandlerThread a Handler
           •Třeba definovat v manifestu




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
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()



Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
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);




Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
Síťování




Tuesday, March 19, 13
Síťování

           •Http Client, UrlConnection




Tuesday, March 19, 13
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
                        	   	   }




Tuesday, March 19, 13
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
                        	   	   }




Tuesday, March 19, 13
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
                        	   	   }




           •Oprávnění
               • android.permission.INTERNET

Tuesday, March 19, 13
Parsování a db insert




Tuesday, March 19, 13
Parsování a db insert

           •JSON - JSONObject, JSONArray




Tuesday, March 19, 13
Parsování a db insert

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




Tuesday, March 19, 13
Parsování a db insert

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


           •XML




Tuesday, March 19, 13
Parsování a db insert

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


           •XML
               • android.util.XML




Tuesday, March 19, 13
Parsování a db insert

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


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




Tuesday, March 19, 13
Parsování a db insert

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


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


Tuesday, March 19, 13
Parsování a db insert

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


           •XML
               • android.util.XML
               • android.sax.RootElement
           •ContentValues
           • db.insert()




Tuesday, March 19, 13
Parsování a db insert

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


           •XML
               • android.util.XML
               • android.sax.RootElement
           •ContentValues
           • db.insert()
           • getContentResolver.notify(Uri,...)



Tuesday, March 19, 13
Příklad

               1.Přes RefreshService aktualizujte tabulku
                 Books
               2.http://dl.dropbox.com/u/5296640/
                 books.json




           •zdrojáky
               • muni-android-4
           •dokumentace
               • http://goo.gl/3Eee
Tuesday, March 19, 13
Architektura typické aplikace 5

           •Operace create, update, delete




Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data
                               uri                        Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                          UI
                        ListFragment

                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                 data
                               uri        Čtení           Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                           čte data
                        ListFragment                  AsyncQueryHandl
                                             uri,
                                             CV
                               callback
               načítání dat
                                   y

                        CursorLoader

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                         DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                           čte data
                        ListFragment                     AsyncQueryHandl
                                             uri,
                                             CV
                               callback               provede c, u,
               načítání dat                                            uri, CV
                                   y                       d


                        CursorLoader                      ContentProvider

               poskytuje
                               uri
                 data

                                          čte data
                    ContentProvider                               DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete
                                           čte data
                        ListFragment                     AsyncQueryHandl
                                             uri,
                                             CV
                               callback               provede c, u,
               načítání dat                                               uri, CV
                                   y                       d


                        CursorLoader                      ContentProvider

               poskytuje                                                sql,
                               uri                      zapisuje
                 data                                                   CV

                                          čte data
                    ContentProvider                                DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
Architektura typické aplikace 5

           •Operace create, update, delete                                 Zápis
                                           čte data
                        ListFragment                     AsyncQueryHandl
                                             uri,
                                             CV
                               callback               provede c, u,
               načítání dat                                               uri, CV
                                   y                       d


                        CursorLoader                      ContentProvider

               poskytuje                                                sql,
                               uri                      zapisuje
                 data                                                   CV

                                          čte data
                    ContentProvider                                DB
                                             sql



Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
AsyncQueryHandler




Tuesday, March 19, 13
AsyncQueryHandler

           •Volá crud operace v threadu na pozadí




Tuesday, March 19, 13
AsyncQueryHandler

           •Volá crud operace v threadu na pozadí
           •Zpětně notifikuje volajícího




Tuesday, March 19, 13
AsyncQueryHandler

           •Volá crud operace v threadu na pozadí
           •Zpětně notifikuje volajícího
           •Problém - volající nemusí již existovat




Tuesday, March 19, 13
AsyncQueryHandler

           •Volá crud operace v threadu na pozadí
           •Zpětně notifikuje volajícího
           •Problém - volající nemusí již existovat
           •Řešení




Tuesday, March 19, 13
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




Tuesday, March 19, 13
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




Tuesday, March 19, 13
AsyncQueryHandler

           •Volá crud operace v threadu na pozadí
           •Zpětně notifikuje volajícího
           •Problém - volající nemusí již existovat
           •Řešení
               •
             Implementovat jako inner-static nebo top-
                        level
               •        WeakReference pro odkaz na volajícího
                          private class MyQueryHandler extends AsyncQueryHandler {
                              // Use weak reference to avoid memoey leak
                              private WeakReference<MyActivity> mMyActivity;
                              public MyQueryHandler(Context context) {
                                    super(context.getContentResolver());
                                    mMyActivity = new WeakReference<MyActivity>((MyActivity) context);
                              }

                              protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
                                    MyActivity activity = mMyActivity.get();
                                   if (activity != null && !activity.isFinishing()) {
                                        ...
                                   }
                              }

Tuesday, March 19, 13
Příklad

               1.Doplňte c, u, d operace do provideru a
                 fragmentu




           •zdrojáky
               • muni-android-5
           •dokumentace
               • http://goo.gl/BS1hr

Tuesday, March 19, 13
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




Tuesday, March 19, 13

More Related Content

Featured

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at WorkGetSmarter
 

Featured (20)

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 

Muni android-18-5-2012

  • 1. Android 2 Ondra Zahradník MUNI - 18.5.2012 Tuesday, March 19, 13
  • 2. Agenda Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 3. Agenda 1.Rekapitulace z minula Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 4. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 5. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 6. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 7. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.Přestávka Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 8. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.Přestávka 6.Architektura typické aplikace Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 9. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.Přestávka 6.Architektura typické aplikace 7.Otázky a odpovědi Tuesday, March 19, 13 nejdrive trochu teorie, potom prakticky priklad prvni dva priklady se tykaji UI, druhe dva pak programovani behem prikladu budu obchazet a pomahat
  • 10. House-keeping notes •slajdy - http://goo.gl/QiFDy •zdroje - http://goo.gl/QH5J7 •vaše otázky Tuesday, March 19, 13
  • 11. Rekapitulace z minula 1.Android SDK 2.Eclipse + ADT 3.Emulátor / device 4.Založení nového projektu 5.Struktura Android projektu 6.Activity, layout, Intent = UI 7.Kompilace a spuštění 8.Debugging Tuesday, March 19, 13
  • 12. Broadcasty Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 13. Broadcasty •Aplikace reaguje na důležité události Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 14. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 15. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 16. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 17. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { //TODO do something } } Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 18. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } } Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 19. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } } • globální Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 20. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } } • globální • lokální - notifikační systém uvnitř appky, levné Tuesday, March 19, 13 aplikaci to i probudí vykonat rychlou akci (limit 10s) mozno broadcasty radit i stopnout
  • 22. Příklad •Vypište číslo a text příchozí sms v toastu Tuesday, March 19, 13
  • 23. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk Tuesday, March 19, 13
  • 24. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS Tuesday, March 19, 13
  • 25. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek Tuesday, March 19, 13
  • 26. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPdu Tuesday, March 19, 13
  • 27. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPdu •SMS lze posílat z DDMS do emulátoru Tuesday, March 19, 13
  • 28. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPdu •SMS lze posílat z DDMS do emulátoru •zdrojáky - muni-android-hello Tuesday, March 19, 13
  • 30. Různá zařízení •deklarativně podadresáři v /res Tuesday, March 19, 13
  • 31. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativní Tuesday, March 19, 13
  • 32. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativní dvě zařízení jeden layout Tuesday, March 19, 13
  • 33. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativní dvě zařízení jeden layout jedno zařízení dva layouty Tuesday, March 19, 13
  • 35. Zdroje a kvalifikátory •Zdroje Tuesday, March 19, 13
  • 36. Zdroje a kvalifikátory •Zdroje • texty, obrázky, layout, barvy,... Tuesday, March 19, 13
  • 37. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xml Tuesday, March 19, 13
  • 38. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) Tuesday, March 19, 13
  • 39. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) Tuesday, March 19, 13
  • 40. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) Tuesday, March 19, 13
  • 41. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port) Tuesday, March 19, 13
  • 42. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port) • hustota (ldpi, mdpi, hdpi, xhdpi) Tuesday, March 19, 13
  • 43. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port) • hustota (ldpi, mdpi, hdpi, xhdpi) res/ • layout, layout-land, layout-land-v13 drawable/ icon.png background.png • drawable, drawable-hdpi, drawable-xhdpi drawable-hdpi/ icon.png background.png Tuesday, March 19, 13
  • 46. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ Tuesday, March 19, 13
  • 47. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ Primary text input method = 12key Tuesday, March 19, 13
  • 48. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ 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/ Tuesday, March 19, 13
  • 49. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ 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/ Tuesday, March 19, 13
  • 50. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ 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/ Tuesday, March 19, 13
  • 52. Různé obrazovky •obrazovky small, normal, large, xlarge Tuesday, March 19, 13
  • 53. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout Tuesday, March 19, 13
  • 54. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patch Tuesday, March 19, 13
  • 55. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patch Tuesday, March 19, 13
  • 56. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patch Tuesday, March 19, 13
  • 58. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi Tuesday, March 19, 13
  • 59. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi Tuesday, March 19, 13
  • 60. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi • xhdpi: 2.0 • hdpi: 1.5 • mdpi: 1.0 (baseline) • ldpi: 0.75 Tuesday, March 19, 13
  • 61. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi MyProject/ res/ drawable-xhdpi/ • xhdpi: 2.0 awesomeimage.png • hdpi: 1.5 drawable-hdpi/ • mdpi: 1.0 (baseline) awesomeimage.png drawable-mdpi/ • ldpi: 0.75 awesomeimage.png drawable-ldpi/ awesomeimage.png Tuesday, March 19, 13
  • 62. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi MyProject/ res/ drawable-xhdpi/ • xhdpi: 2.0 awesomeimage.png • hdpi: 1.5 drawable-hdpi/ • mdpi: 1.0 (baseline) awesomeimage.png drawable-mdpi/ • ldpi: 0.75 awesomeimage.png drawable-ldpi/ awesomeimage.png •dp = density independent pixel Tuesday, March 19, 13
  • 64. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3 Tuesday, March 19, 13
  • 65. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3 •Nastavit minSdkVersion a targetSdkVersion <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >     <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />     ... </manifest> Tuesday, March 19, 13
  • 66. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3 •Nastavit minSdkVersion a targetSdkVersion •Kontrolovat verzi API private void setUpActionBar() {     // Make sure we're running on Honeycomb or higher to use ActionBar APIs     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {         ActionBar actionBar = getActionBar();         actionBar.setDisplayHomeAsUpEnabled(true);     } } Tuesday, March 19, 13
  • 67. Příklad •Rozšiřte příklad kalkulačky z minulé přednášky o podporu češtiny a landscape režimu •zdrojáky, ze kterých lze vyjít • muni-android-hello •dokumentace • http://goo.gl/RKihT Tuesday, March 19, 13
  • 68. Dynamické UI pomocí fragmentů •Fragment je kus funkčního UI •Aktivita hostí fragmenty •Jedna aplikace pro telefon i tablet Tuesday, March 19, 13
  • 71. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } } Tuesday, March 19, 13
  • 72. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } } Layout <fragment android:name="com.example.android.fragments.ArticleFragment"               android:id="@+id/article_fragment"               android:layout_weight="2"               android:layout_width="0dp"               android:layout_height="match_parent" /> Tuesday, March 19, 13
  • 73. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } } Layout <fragment android:name="com.example.android.fragments.ArticleFragment"               android:id="@+id/article_fragment"               android:layout_weight="2"               android:layout_width="0dp"               android:layout_height="match_parent" /> Instance public class MainActivity extends FragmentActivity {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.news_articles);     } } Tuesday, March 19, 13
  • 74. Fragmenty na telefonu a tabletu Tuesday, March 19, 13
  • 75. Fragmenty na telefonu a tabletu Tuesday, March 19, 13
  • 76. 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> Tuesday, March 19, 13
  • 77. 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> Tuesday, March 19, 13
  • 78. 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);         }     } } Tuesday, March 19, 13
  • 81. Komunikace mezi fragmenty •FragmentA definuje Listener interface Tuesday, March 19, 13
  • 82. Komunikace mezi fragmenty •FragmentA definuje Listener interface •Activity interface implementuje Tuesday, March 19, 13
  • 83. Komunikace mezi fragmenty •FragmentA definuje Listener interface •Activity interface implementuje •FragmentA volá callback onItemSelected(...) Tuesday, March 19, 13
  • 84. Nové API na starých Androidech •support lib. zpřístupňuje nové api pro staré devices •Fragment, Loader •ViewPager, accessibility, NotificationBuilder,... import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; ... •ActionBarSherlock •Animations Tuesday, March 19, 13
  • 85. 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 Tuesday, March 19, 13
  • 87. Architektura typické aplikace 1 •Zobraz seznam položek z databáze Tuesday, March 19, 13
  • 88. Architektura typické aplikace 1 •Zobraz seznam položek z databáze ListFragment Tuesday, March 19, 13
  • 89. Architektura typické aplikace 1 •Zobraz seznam položek z databáze čte data ListFragment DB Tuesday, March 19, 13
  • 90. Architektura typické aplikace 1 •Zobraz seznam položek z databáze čte data ListFragment DB sql Tuesday, March 19, 13
  • 91. Architektura typické aplikace 1 •Zobraz seznam položek z databáze UI čte data ListFragment DB sql Tuesday, March 19, 13
  • 92. Architektura typické aplikace 1 •Zobraz seznam položek z databáze UI Model čte data ListFragment DB sql Tuesday, March 19, 13
  • 93. Databáze Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 94. Databáze •SQLite v3 databáze Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 95. Databáze •SQLite v3 databáze •SQLiteOpenHelper Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 96. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 97. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 98. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade() Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 99. 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 Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 100. 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() Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 101. 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 () Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 102. 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() Tuesday, March 19, 13 nefunguji cizí klíče casto implementovan jako singleton
  • 103. Cursor Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 104. Cursor •zpřístupňuje řádky výsledku db.query() Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 105. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 106. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 107. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 108. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName) Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 109. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName) • getString(int columnIndex), ... Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 110. 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,........) Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 111. 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 Tuesday, March 19, 13 optimalizovane dotazy do databaze
  • 112. Příklad 1.prozkoumejte DatabaseHelper 2.v MainFragment zobrazte seznam knizek v DB 1.hint: použijte Cursor a SimpleCursorAdapter •zdrojáky • muni-android-1 •dokumentace • http://goo.gl/eme2a Tuesday, March 19, 13
  • 113. Architektura typické aplikace 2 •Zobraz seznam položek z databáze Tuesday, March 19, 13
  • 114. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment Tuesday, March 19, 13
  • 115. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje data ContentProvider Tuesday, March 19, 13
  • 116. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje uri data ContentProvider Tuesday, March 19, 13
  • 117. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13
  • 118. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13
  • 119. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sql Tuesday, March 19, 13
  • 120. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sql Boilerplate Tuesday, March 19, 13
  • 122. ContentProvider •Jednotné API pro přístup k modelu Tuesday, March 19, 13
  • 123. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází Tuesday, March 19, 13
  • 124. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází •REST-like api a systém URI Tuesday, March 19, 13
  • 125. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází •REST-like api a systém URI •Řeší synchronizaci Tuesday, March 19, 13
  • 126. 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 Tuesday, March 19, 13
  • 127. Příklad 1.prozkoumejte komunikaci provideru a databáze 2.v Provider naimplementujte query operaci 3.v MainFragment načtěte data přes provider •zdrojáky • muni-android-2 •dokumentace • http://goo.gl/EFKK7 Tuesday, March 19, 13
  • 128. Architektura typické aplikace 3 •Zobraz seznam položek z databáze Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 129. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 130. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment načítání dat CursorLoader Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 131. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 132. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje data ContentProvider Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 133. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data ContentProvider Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 134. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 135. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 136. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 137. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 138. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y Boilerplate CursorLoader poskytuje data uri Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 140. Asynchroní operace •Omezený programovací model Tuesday, March 19, 13
  • 141. Asynchroní operace •Omezený programovací model • slabý procesor Tuesday, March 19, 13
  • 142. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking Tuesday, March 19, 13
  • 143. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu Tuesday, March 19, 13
  • 144. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR Tuesday, March 19, 13
  • 145. 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 Tuesday, March 19, 13
  • 146. 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 Tuesday, March 19, 13
  • 147. 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 Tuesday, March 19, 13
  • 148. 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 Tuesday, March 19, 13
  • 149. 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 Tuesday, March 19, 13
  • 151. CursorLoader •Čte z ContentProvideru na pozadí Tuesday, March 19, 13
  • 152. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() Tuesday, March 19, 13
  • 153. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() •Umí reusovat jednou nahraný Cursor Tuesday, March 19, 13
  • 154. 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 Tuesday, March 19, 13
  • 155. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() •Umí reusovat jednou nahraný Cursor •Obnoví Cursor při updatu modelu •Je třeba volat v jako onActivityCreated() getActivity().getSupportLoaderManager().initLoader() Tuesday, March 19, 13
  • 156. Příklad 1.nahraďte volání provideru CursorLoaderem 1.hint: fragment nechť implementuje LoaderManager.LoaderCallbacks 2.hint: použijte getActivity().getContentResolver() •zdrojáky • muni-android-3 •dokumentace • http://goo.gl/BBb2N Tuesday, March 19, 13
  • 157. Architektura typické aplikace 4 •Aktualizace z internetu Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 158. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 159. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 160. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 161. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Čtení Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 162. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment Inten IntentService t callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 163. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment Inten IntentService t callback provede načítání dat síťování y CursorLoader poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 164. Architektura typické aplikace 4 •Aktualizace z internetu Aktualizace ListFragment Inten IntentService t callback provede načítání dat síťování y CursorLoader poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 165. IntentService Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 166. IntentService •Implementuje frontu tasků za zpracovaní Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 167. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 168. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a Handler Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 169. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a Handler •Třeba definovat v manifestu Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 170. 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() Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 171. 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); Tuesday, March 19, 13 parametry mozno predat bundlem konci, pokud neni co zpracovavat,
  • 173. Síťování •Http Client, UrlConnection Tuesday, March 19, 13
  • 174. 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 } Tuesday, March 19, 13
  • 175. 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 } Tuesday, March 19, 13
  • 176. 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 } •Oprávnění • android.permission.INTERNET Tuesday, March 19, 13
  • 177. Parsování a db insert Tuesday, March 19, 13
  • 178. Parsování a db insert •JSON - JSONObject, JSONArray Tuesday, March 19, 13
  • 179. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() Tuesday, March 19, 13
  • 180. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML Tuesday, March 19, 13
  • 181. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML Tuesday, March 19, 13
  • 182. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement Tuesday, March 19, 13
  • 183. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValues Tuesday, March 19, 13
  • 184. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValues • db.insert() Tuesday, March 19, 13
  • 185. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValues • db.insert() • getContentResolver.notify(Uri,...) Tuesday, March 19, 13
  • 186. Příklad 1.Přes RefreshService aktualizujte tabulku Books 2.http://dl.dropbox.com/u/5296640/ books.json •zdrojáky • muni-android-4 •dokumentace • http://goo.gl/3Eee Tuesday, March 19, 13
  • 187. Architektura typické aplikace 5 •Operace create, update, delete Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 188. Architektura typické aplikace 5 •Operace create, update, delete ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 189. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 190. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 191. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Čtení Model čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 192. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 193. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje uri data čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 194. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 195. Architektura typické aplikace 5 •Operace create, update, delete Zápis čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sql Tuesday, March 19, 13 můžeme vyřešit update modelu aktivita je hloupe ui
  • 197. AsyncQueryHandler •Volá crud operace v threadu na pozadí Tuesday, March 19, 13
  • 198. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího Tuesday, March 19, 13
  • 199. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat Tuesday, March 19, 13
  • 200. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •Řešení Tuesday, March 19, 13
  • 201. 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 Tuesday, March 19, 13
  • 202. 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 Tuesday, March 19, 13
  • 203. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •Řešení • Implementovat jako inner-static nebo top- level • WeakReference pro odkaz na volajícího private class MyQueryHandler extends AsyncQueryHandler { // Use weak reference to avoid memoey leak private WeakReference<MyActivity> mMyActivity; public MyQueryHandler(Context context) { super(context.getContentResolver()); mMyActivity = new WeakReference<MyActivity>((MyActivity) context); } protected void onQueryComplete(int token, Object cookie, Cursor cursor) { MyActivity activity = mMyActivity.get(); if (activity != null && !activity.isFinishing()) { ... } } Tuesday, March 19, 13
  • 204. Příklad 1.Doplňte c, u, d operace do provideru a fragmentu •zdrojáky • muni-android-5 •dokumentace • http://goo.gl/BS1hr Tuesday, March 19, 13
  • 205. 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 Tuesday, March 19, 13