SlideShare uma empresa Scribd logo
1 de 231
Baixar para ler offline
Android 2
                              Ondra Zahradník
                              MFF - 5.12.2012




Wednesday, December 5, 2012
Agenda




Wednesday, December 5, 2012
Agenda

          1. Rekapitulace z minula




Wednesday, December 5, 2012
Agenda

          1. Rekapitulace z minula
          2. BroadcastReceiver




Wednesday, December 5, 2012
Agenda

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




Wednesday, December 5, 2012
Agenda

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




Wednesday, December 5, 2012
Agenda

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




Wednesday, December 5, 2012
Agenda

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




Wednesday, December 5, 2012
Agenda

          1. Rekapitulace z minula
          2. BroadcastReceiver
          3. Podpora různých zařízení
          4. Dynamické UI pomocí fragmentů
          5. Přestávka
          6. Architektura typické aplikace
          7. Otázky a odpovědi



Wednesday, December 5, 2012
House-keeping notes

          • slajdy - http://goo.gl/2siyO
          • zdroje - http://goo.gl/HqMIs
          • vaše otázky




Wednesday, December 5, 2012
Rekapitulace z minula

          1. Android SDK
          2. Eclipse + ADT
          3. Emulátor / device
          4. Založení nového projektu
          5. Struktura Android projektu
          6. Activity, layout, Intent = UI
          7. Kompilace a spuštění
          8. Debugging

Wednesday, December 5, 2012
Broadcasty




Wednesday, December 5, 2012
Broadcasty

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




Wednesday, December 5, 2012
Broadcasty

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




Wednesday, December 5, 2012
Broadcasty

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




Wednesday, December 5, 2012
Broadcasty

          • Aplikace reaguje na důležité události
              • Boot, SMS, Call, připojení, čas...
          • BroadcastReceiver
                     <receiver android:name=".SMSReceiver">
                         <intent-filter >
                             <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                         </intent-filter>
                     </receiver>




Wednesday, December 5, 2012
Broadcasty

          • Aplikace reaguje na důležité události
              • Boot, SMS, Call, připojení, čas...
          • BroadcastReceiver
                     <receiver android:name=".SMSReceiver">
                         <intent-filter >
                             <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                         </intent-filter>
                     </receiver>



                    public class SMSReceiver extends BroadcastReceiver {
                    	   @Override
                    	   public void onReceive(Context ctx, Intent i) {
                    	   	    //TODO do something
                    	   }
                    }




Wednesday, December 5, 2012
Broadcasty

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


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




Wednesday, December 5, 2012
Broadcasty

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


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



              • globální

Wednesday, December 5, 2012
Broadcasty

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


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



              • globální
              • lokální - notifikační systém uvnitř appky, levné
Wednesday, December 5, 2012
Příklad




Wednesday, December 5, 2012
Příklad

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




Wednesday, December 5, 2012
Příklad

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




Wednesday, December 5, 2012
Příklad

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




Wednesday, December 5, 2012
Příklad

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




Wednesday, December 5, 2012
Příklad

          • Vypište číslo a text příchozí sms v toastu
              • Toast - http://goo.gl/WoTk
              • Oprávnění android.permission.RECEIVE_SMS
              • SMS Intent - extra “pdus” seznam smsek
              • SmsMessage.createFromPdu




Wednesday, December 5, 2012
Příklad

          • Vypište číslo a text příchozí sms v toastu
              • Toast - http://goo.gl/WoTk
              • Oprávnění android.permission.RECEIVE_SMS
              • SMS Intent - extra “pdus” seznam smsek
              • SmsMessage.createFromPdu
          • SMS lze posílat z DDMS do emulátoru



Wednesday, December 5, 2012
Příklad

          • Vypište číslo a text příchozí sms v toastu
              • Toast - http://goo.gl/WoTk
              • Oprávnění android.permission.RECEIVE_SMS
              • SMS Intent - extra “pdus” seznam smsek
              • SmsMessage.createFromPdu
          • SMS lze posílat z DDMS do emulátoru

          • zdrojáky - mff-android-hello
Wednesday, December 5, 2012
Zdroje a kvalifikátory




Wednesday, December 5, 2012
Zdroje a kvalifikátory

          • Zdroje




Wednesday, December 5, 2012
Zdroje a kvalifikátory

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




Wednesday, December 5, 2012
Zdroje a kvalifikátory

          • Zdroje                                  MyProject/
                                                        src/



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




Wednesday, December 5, 2012
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, ...)




Wednesday, December 5, 2012
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)




Wednesday, December 5, 2012
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)




Wednesday, December 5, 2012
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)




Wednesday, December 5, 2012
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)




Wednesday, December 5, 2012
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




Wednesday, December 5, 2012
Resource resolving




Wednesday, December 5, 2012
Resource resolving




Wednesday, December 5, 2012
Resource resolving
             drawable/
             drawable-en/
             drawable-fr-rCA/
             drawable-en-port/
             drawable-en-notouch-12key/
             drawable-port-ldpi/
             drawable-port-notouch-12key/




Wednesday, December 5, 2012
Resource resolving
             drawable/
             drawable-en/
             drawable-fr-rCA/               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




Wednesday, December 5, 2012
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/




Wednesday, December 5, 2012
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/




Wednesday, December 5, 2012
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/




Wednesday, December 5, 2012
Různé obrazovky




Wednesday, December 5, 2012
Různé obrazovky

          • obrazovky small, normal, large, xlarge




Wednesday, December 5, 2012
Různé obrazovky

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




Wednesday, December 5, 2012
Různé obrazovky

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




Wednesday, December 5, 2012
Různé obrazovky

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




Wednesday, December 5, 2012
Různé obrazovky

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




Wednesday, December 5, 2012
Různé hustoty




Wednesday, December 5, 2012
Různé hustoty




Wednesday, December 5, 2012
Různé hustoty




Wednesday, December 5, 2012
Různé hustoty




Wednesday, December 5, 2012
Různé hustoty

          • hustoty ldpi, mdpi, hdpi, xhdpi




Wednesday, December 5, 2012
Různé hustoty

          • hustoty ldpi, mdpi, hdpi, xhdpi




Wednesday, December 5, 2012
Různé hustoty

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




Wednesday, December 5, 2012
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




Wednesday, December 5, 2012
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

Wednesday, December 5, 2012
Podpora různých verzí




Wednesday, December 5, 2012
Podpora různých verzí

          • Na trhu Android v2.1 - v4.0.3




Wednesday, December 5, 2012
Podpora různých verzí

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




Wednesday, December 5, 2012
Podpora různých verzí

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




Wednesday, December 5, 2012
Příklad

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


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


Wednesday, December 5, 2012
Různá zařízení




Wednesday, December 5, 2012
Různá zařízení

          • deklarativně podadresáři v /res




Wednesday, December 5, 2012
Různá zařízení

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




Wednesday, December 5, 2012
Různá zařízení

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




Wednesday, December 5, 2012
Různá zařízení

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



                   jedno zařízení
                   dva layouty


Wednesday, December 5, 2012
Dynamické UI pomocí fragmentů

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




Wednesday, December 5, 2012
Fragment




Wednesday, December 5, 2012
Fragment




Wednesday, December 5, 2012
Fragment

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




Wednesday, December 5, 2012
Fragment

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



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




Wednesday, December 5, 2012
Fragment

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



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




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




Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu




Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu




Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu




                              <?xml version="1.0" encoding="utf-8"?>
                              <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                android:orientation="horizontal"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:id="@+id/frags">
                                  <!-- "Fragment A" -->
                                <fragment class="com.example.android.TitlesFragment"
                                          android:id="@+id/list_frag"
                                          android:layout_width="@dimen/titles_size"
                                          android:layout_height="match_parent"/>
                                  <!-- "Fragment B" -->
                                <fragment class="com.example.android.DetailsFragment"
                                          android:id="@+id/details_frag"
                                          android:layout_width="match_parent"
                                          android:layout_height="match_parent" />
                              </LinearLayout>


Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu




                              <?xml version="1.0" encoding="utf-8"?>
                              <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                  android:layout_width="match_parent"
                                  android:layout_height="match_parent">
                                  <!-- "Fragment A" -->
                                  <fragment class="com.example.android.TitlesFragment"
                                            android:id="@+id/list_frag"
                                            android:layout_width="match_parent"
                                            android:layout_height="match_parent"/>
                              </FrameLayout>




Wednesday, December 5, 2012
Fragmenty na telefonu a tabletu




                      public class MainActivity extends Activity implements TitlesFragment.OnItemSelectedListener {
                          public void onItemSelected(int position) {
                              DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
                                                          .findFragmentById(R.id.display_frag);
                              if (displayFrag == null) {
                                  // DisplayFragment (Fragment B) is not in the layout (handset layout),
                                  // so start DisplayActivity (Activity B)
                                  // and pass it the info about the selected item
                                  Intent intent = new Intent(this, DisplayActivity.class);
                                  intent.putExtra("position", position);
                                  startActivity(intent);
                              } else {
                                  // DisplayFragment (Fragment B) is in the layout (tablet layout),
                                  // so tell the fragment to update
                                  displayFrag.updateContent(position);
                              }
                          }
                      }


Wednesday, December 5, 2012
Komunikace mezi fragmenty




Wednesday, December 5, 2012
Komunikace mezi fragmenty




Wednesday, December 5, 2012
Komunikace mezi fragmenty




          • FragmentA definuje Listener interface



Wednesday, December 5, 2012
Komunikace mezi fragmenty




          • FragmentA definuje Listener interface
          • Activity interface implementuje


Wednesday, December 5, 2012
Komunikace mezi fragmenty




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

Wednesday, December 5, 2012
Nové API na starých Androidech

          • support lib. zpřístupňuje nové api pro staré
               devices
          • Fragment, Loader
          • ViewPager, accessibility, NotificationBuilder,...
                import android.support.v4.app.Fragment;
                import android.support.v4.app.FragmentManager;
                ...




          • ActionBarSherlock
          • Animations
Wednesday, December 5, 2012
Příklad

          • do seznamu přidejte možnost změnit položku
          • změnu potvrďte FragmentDialogem

          • zdrojáky
              • http://goo.gl/NmK4o
          • dokumentace
              • http://goo.gl/tuZwX
              • http://goo.gl/bK5GQ
Wednesday, December 5, 2012
Přestávka




Wednesday, December 5, 2012
Motivace -rychlé appky




Wednesday, December 5, 2012
Motivace -rychlé appky

          • Nechceme čekat, když čekáme




Wednesday, December 5, 2012
Motivace -rychlé appky

          • Nechceme čekat, když čekáme
          • Chceme rychlé appky




Wednesday, December 5, 2012
Motivace -rychlé appky

          • Nechceme čekat, když čekáme
          • Chceme rychlé appky
              1.síťovat, když se nikdo nedívá




Wednesday, December 5, 2012
Motivace -rychlé appky

          • Nechceme čekat, když čekáme
          • Chceme rychlé appky
              1.síťovat, když se nikdo nedívá
              2.provádět akce okamžitě




Wednesday, December 5, 2012
Motivace -rychlé appky

          • Nechceme čekat, když čekáme
          • Chceme rychlé appky
              1.síťovat, když se nikdo nedívá
              2.provádět akce okamžitě
              3.prioritizovat tasky




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Příklad - Corkbin pro iOS a Android




Wednesday, December 5, 2012
Omezený programovací model




Wednesday, December 5, 2012
Omezený programovací model

          • Slabý procesor




Wednesday, December 5, 2012
Omezený programovací model

          • Slabý procesor
          • Opravdový multi-tasking




Wednesday, December 5, 2012
Omezený programovací model

          • Slabý procesor
          • Opravdový multi-tasking
          • “Application not responding” aka. ANR




Wednesday, December 5, 2012
Omezený programovací model

          • Slabý procesor
          • Opravdový multi-tasking
          • “Application not responding” aka. ANR
          • Aktualizace UI pouze v ui threadu




Wednesday, December 5, 2012
Omezený programovací model

          • Slabý procesor
          • Opravdový multi-tasking
          • “Application not responding” aka. ANR
          • Aktualizace UI pouze v ui threadu
          • UI žije jenom chvíli



Wednesday, December 5, 2012
Architektura typické aplikace 1

          • Zobraz seznam položek z databáze




Wednesday, December 5, 2012
Architektura typické aplikace 1

          • Zobraz seznam položek z databáze


                         ListFragment




Wednesday, December 5, 2012
Architektura typické aplikace 1

          • Zobraz seznam položek z databáze

                                        čte data
                         ListFragment              DB




Wednesday, December 5, 2012
Architektura typické aplikace 1

          • Zobraz seznam položek z databáze

                                        čte data
                         ListFragment              DB
                                          sql




Wednesday, December 5, 2012
Architektura typické aplikace 1

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




Wednesday, December 5, 2012
Architektura typické aplikace 1

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




Wednesday, December 5, 2012
Databáze




Wednesday, December 5, 2012
Databáze

          • SQLite v3 databáze




Wednesday, December 5, 2012
Databáze

          • SQLite v3 databáze
          • SQLiteOpenHelper




Wednesday, December 5, 2012
Databáze

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




Wednesday, December 5, 2012
Databáze

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




Wednesday, December 5, 2012
Databáze

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




Wednesday, December 5, 2012
Databáze

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




Wednesday, December 5, 2012
Databáze

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




Wednesday, December 5, 2012
Databáze

          • SQLite v3 databáze
          • SQLiteOpenHelper
              • stará se o life-cycle databáze
              • callbacky pro vytvoření a upgrade
                  • onCreate() a onUpgrade()
              •    zpřístupňuje interface databáze
                  • getWritableDatabase()
                  • db.query(), db.insert (), db.update   (), db.delete ()




Wednesday, December 5, 2012
Databáze

          • SQLite v3 databáze
          • SQLiteOpenHelper
              • stará se o life-cycle databáze
              • callbacky pro vytvoření a upgrade
                  • onCreate() a onUpgrade()
              •    zpřístupňuje interface databáze
                  • getWritableDatabase()
                  • db.query(), db.insert (), db.update (), db.delete ()
                  • db.beginTransaction(), db.setTransactionSuccessful(),
                        db.endTransaction()




Wednesday, December 5, 2012
Cursor




Wednesday, December 5, 2012
Cursor

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




Wednesday, December 5, 2012
Cursor

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


          • metody pro pohyb




Wednesday, December 5, 2012
Cursor

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


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




Wednesday, December 5, 2012
Cursor

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


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


          • metody pro čtení




Wednesday, December 5, 2012
Cursor

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


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


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




Wednesday, December 5, 2012
Cursor

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


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


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




Wednesday, December 5, 2012
Cursor

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


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


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

          • db.query(table,       columns, selection, selectionArgs,........)




Wednesday, December 5, 2012
Cursor

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


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


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

          • db.query(table, columns, selection,         selectionArgs,........)

          • SimpleCursorAdapter, CursorAdapter



Wednesday, December 5, 2012
Příklad

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



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

Wednesday, December 5, 2012
Architektura typické aplikace 2

          • Zobraz seznam položek z databáze




Wednesday, December 5, 2012
Architektura typické aplikace 2

          • Zobraz seznam položek z databáze
                         ListFragment




Wednesday, December 5, 2012
Architektura typické aplikace 2

          • Zobraz seznam položek z databáze
                         ListFragment

            poskytuje data


                      ContentProvider




Wednesday, December 5, 2012
Architektura typické aplikace 2

          • Zobraz seznam položek z databáze
                         ListFragment

            poskytuje data      uri


                      ContentProvider




Wednesday, December 5, 2012
Architektura typické aplikace 2

          • Zobraz seznam položek z databáze
                         ListFragment

            poskytuje data      uri

                                        čte data
                      ContentProvider              DB
                                           sql




Wednesday, December 5, 2012
Architektura typické aplikace 2

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

            poskytuje data      uri

                                        čte data
                      ContentProvider              DB
                                           sql




Wednesday, December 5, 2012
Architektura typické aplikace 2

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

            poskytuje data      uri                Model
                                        čte data
                      ContentProvider               DB
                                           sql




Wednesday, December 5, 2012
Architektura typické aplikace 2

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

            poskytuje data      uri                Model
                                        čte data
                      ContentProvider               DB
                                           sql


                    Boilerplate



Wednesday, December 5, 2012
ContentProvider




Wednesday, December 5, 2012
ContentProvider

          • Jednotné API pro přístup k modelu




Wednesday, December 5, 2012
ContentProvider

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




Wednesday, December 5, 2012
ContentProvider

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




Wednesday, December 5, 2012
ContentProvider

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




Wednesday, December 5, 2012
ContentProvider

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



Wednesday, December 5, 2012
Příklad

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



          • zdrojáky
              • mff-android-2
          • dokumentace
              • http://goo.gl/EFKK7

Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze




Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment




Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat


                       CursorLoader




Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat   callbacky


                       CursorLoader




Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data


                    ContentProvider



Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri


                    ContentProvider



Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB



Wednesday, December 5, 2012
Architektura typické aplikace 3

          • Zobraz seznam položek z databáze
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 3

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

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 3

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

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri                    Model
                                          čte data
                    ContentProvider                   DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 3

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

               načítání dat   callbacky

                                          Boilerplate
                       CursorLoader

           poskytuje data     uri                       Model
                                          čte data
                    ContentProvider                      DB
                                             sql



Wednesday, December 5, 2012
Asynchroní operace




Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model




Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model
              • slabý procesor




Wednesday, December 5, 2012
Asynchroní operace

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




Wednesday, December 5, 2012
Asynchroní operace

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




Wednesday, December 5, 2012
Asynchroní operace

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




Wednesday, December 5, 2012
Asynchroní operace

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




Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model
              • slabý procesor
              • multi-tasking
              • aktualizace UI pouze v ui threadu
              • Application not responding aka. ANR
              • UI žije jenom chvíli
          • Vše, co může dlouho trvat, mimo ui thread


Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model
              • slabý procesor
              • multi-tasking
              • aktualizace UI pouze v ui threadu
              • Application not responding aka. ANR
              • UI žije jenom chvíli
          • Vše, co může dlouho trvat, mimo ui thread
              • síťová komunikace


Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model
              • slabý procesor
              • multi-tasking
              • aktualizace UI pouze v ui threadu
              • Application not responding aka. ANR
              • UI žije jenom chvíli
          • Vše, co může dlouho trvat, mimo ui thread
              • síťová komunikace
              • čtení z databáze

Wednesday, December 5, 2012
Asynchroní operace

          • Omezený programovací model
              • slabý procesor
              • multi-tasking
              • aktualizace UI pouze v ui threadu
              • Application not responding aka. ANR
              • UI žije jenom chvíli
          • Vše, co může dlouho trvat, mimo ui thread
              • síťová komunikace
              • čtení z databáze
              • čtení z filesystému
Wednesday, December 5, 2012
CursorLoader




Wednesday, December 5, 2012
CursorLoader

          • Čte z ContentProvideru na pozadí




Wednesday, December 5, 2012
CursorLoader

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




Wednesday, December 5, 2012
CursorLoader

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


          • Umí reusovat jednou nahraný Cursor



Wednesday, December 5, 2012
CursorLoader

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


          • Umí reusovat jednou nahraný Cursor
          • Obnoví Cursor při updatu modelu


Wednesday, December 5, 2012
CursorLoader

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


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




Wednesday, December 5, 2012
Příklad

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

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


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

Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu




Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                               sql



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri                         Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

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



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                       ListFragment                  IntentService
                                            Intent

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                       DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu
                       ListFragment                      IntentService
                                            Intent
                                                     provede
               načítání dat   callbacky              síťování


                       CursorLoader

           poskytuje data     uri                    zapisuje    sql, CV

                                          čte data
                    ContentProvider                             DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 4

          • Aktualizace z internetu                              Aktualizace

                       ListFragment                      IntentService
                                            Intent
                                                     provede
               načítání dat   callbacky              síťování


                       CursorLoader

           poskytuje data     uri                    zapisuje    sql, CV

                                          čte data
                    ContentProvider                             DB
                                             sql



Wednesday, December 5, 2012
IntentService




Wednesday, December 5, 2012
IntentService

          • Implementuje frontu tasků za zpracovaní




Wednesday, December 5, 2012
IntentService

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




Wednesday, December 5, 2012
IntentService

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


          • Impl. pomocí HandlerThread a Handler




Wednesday, December 5, 2012
IntentService

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


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




Wednesday, December 5, 2012
IntentService

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


          • Impl. pomocí HandlerThread a Handler
          • Třeba definovat v manifestu
          • Volání přes Context.startService()



Wednesday, December 5, 2012
IntentService

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


          • Impl. pomocí HandlerThread a Handler
          • Třeba definovat v manifestu
          • Volání přes Context.startService()
                final Intent i = new Intent(getActivity(), MyService.class);
                getActivity().startService(i);




Wednesday, December 5, 2012
Síťování




Wednesday, December 5, 2012
Síťování

          • Http Client, UrlConnection




Wednesday, December 5, 2012
Síťování

          • Http Client, UrlConnection
                      	       	   try {
                      	       	   	    final URL url = new URL("http://....");
                      	       	   	    final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                      	       	   	    if (connection.getResponseCode() == 200) {
                      	       	   	    	    final InputStream is = connection.getInputStream();
                      	       	   	    	    try {
                      	       	   	    	    	    //TODO networking
                      	       	   	    	    } finally {
                      	       	   	    	    	    is.close();
                      	       	   	    	    }
                      	       	   	    }
                      	       	   } catch (IOException e) {
                      	       	   	    // TODO: handle exception
                      	       	   }




Wednesday, December 5, 2012
Síťování

          • Http Client, UrlConnection
                      	       	   try {
                      	       	   	    final URL url = new URL("http://....");
                      	       	   	    final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                      	       	   	    if (connection.getResponseCode() == 200) {
                      	       	   	    	    final InputStream is = connection.getInputStream();
                      	       	   	    	    try {
                      	       	   	    	    	    //TODO networking
                      	       	   	    	    } finally {
                      	       	   	    	    	    is.close();
                      	       	   	    	    }
                      	       	   	    }
                      	       	   } catch (IOException e) {
                      	       	   	    // TODO: handle exception
                      	       	   }




Wednesday, December 5, 2012
Síťování

          • Http Client, UrlConnection
                      	       	   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

Wednesday, December 5, 2012
Parsování a db insert




Wednesday, December 5, 2012
Parsování a db insert

          • JSON - JSONObject, JSONArray




Wednesday, December 5, 2012
Parsování a db insert

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




Wednesday, December 5, 2012
Parsování a db insert

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


          • XML




Wednesday, December 5, 2012
Parsování a db insert

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


          • XML
              • android.util.XML




Wednesday, December 5, 2012
Parsování a db insert

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


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




Wednesday, December 5, 2012
Parsování a db insert

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


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


Wednesday, December 5, 2012
Parsování a db insert

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


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




Wednesday, December 5, 2012
Parsování a db insert

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


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



Wednesday, December 5, 2012
Příklad

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



          • zdrojáky
              • mff-android-4
          • dokumentace
              • http://goo.gl/3Eee

Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete




Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                  DB
                                               sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri                         Model
                                          čte data
                    ContentProvider                  DB
                                               sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete
                                          UI
                       ListFragment

               načítání dat   callbacky


                       CursorLoader

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



Wednesday, December 5, 2012
Architektura typické aplikace 5

          • Operace create, update, delete
                                           čte data
                       ListFragment                   AsyncQueryHandler
                                             uri,
                                             CV
               načítání dat   callbacky


                       CursorLoader

           poskytuje data     uri

                                          čte data
                    ContentProvider                          DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

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


                       CursorLoader                        ContentProvider

           poskytuje data     uri

                                          čte data
                    ContentProvider                                 DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

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


                       CursorLoader                        ContentProvider

           poskytuje data     uri                        zapisuje       sql, CV

                                          čte data
                    ContentProvider                                 DB
                                             sql



Wednesday, December 5, 2012
Architektura typické aplikace 5

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


                       CursorLoader                        ContentProvider

           poskytuje data     uri                        zapisuje       sql, CV

                                          čte data
                    ContentProvider                                 DB
                                             sql



Wednesday, December 5, 2012
AsyncQueryHandler




Wednesday, December 5, 2012
AsyncQueryHandler

          • Volá crud operace v threadu na pozadí




Wednesday, December 5, 2012
AsyncQueryHandler

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




Wednesday, December 5, 2012
AsyncQueryHandler

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




Wednesday, December 5, 2012
AsyncQueryHandler

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




Wednesday, December 5, 2012
AsyncQueryHandler

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




Wednesday, December 5, 2012
AsyncQueryHandler

          • Volá crud operace v threadu na pozadí
          • Zpětně notifikuje volajícího
          • Problém - volající nemusí již existovat
          • Řešení
              • Implementovat jako inner-static nebo top-level
              • WeakReference pro odkaz na volajícího



Wednesday, December 5, 2012
AsyncQueryHandler

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

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

Wednesday, December 5, 2012
Příklad

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



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


Wednesday, December 5, 2012
Děkuji
                                                @ondraz

                      ukázky kódu a obrázky pocházejí z http://developer.android.com pod
                          licencemi Apache v2.0 a Creative Commons Attribution v2.5




Wednesday, December 5, 2012

Mais conteúdo relacionado

Destaque

Historia del real madrid y los mejores jugadores
Historia del real madrid y los mejores jugadoresHistoria del real madrid y los mejores jugadores
Historia del real madrid y los mejores jugadoresalejo rodriguez
 
5th pic meeting es draft opening remarks tcm - clean - final
5th pic meeting es draft opening remarks   tcm - clean - final5th pic meeting es draft opening remarks   tcm - clean - final
5th pic meeting es draft opening remarks tcm - clean - finalBosco Hitimana
 
Guia wgst-spring-2012-okk
Guia wgst-spring-2012-okkGuia wgst-spring-2012-okk
Guia wgst-spring-2012-okkQSSpain
 
Email Marketing Trends 2009
Email Marketing Trends 2009Email Marketing Trends 2009
Email Marketing Trends 2009Silverpop
 
E!Meedia Postimees Online Jaanus Lillenberg 16.12.09
E!Meedia Postimees Online   Jaanus Lillenberg   16.12.09E!Meedia Postimees Online   Jaanus Lillenberg   16.12.09
E!Meedia Postimees Online Jaanus Lillenberg 16.12.09Altex Marketing OÜ
 
Catalogo philips
Catalogo philipsCatalogo philips
Catalogo philipsVALEVS
 
Monta WordPress en tu empresa
Monta WordPress en tu empresaMonta WordPress en tu empresa
Monta WordPress en tu empresaIñaki Arenaza
 
Total Cost of Travel: More Trips, or Better Trips?
Total Cost of Travel: More Trips, or Better Trips?Total Cost of Travel: More Trips, or Better Trips?
Total Cost of Travel: More Trips, or Better Trips?Scott Gillespie
 
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1manel fernandez jaria
 
Introduction to the INTERREG CENTRAL Europe Project: Semi-natural grassland...
Introduction to the INTERREG CENTRAL Europe Project:Semi-natural grassland...Introduction to the INTERREG CENTRAL Europe Project:Semi-natural grassland...
Introduction to the INTERREG CENTRAL Europe Project: Semi-natural grassland...salvere
 
Proceso de cambio para equipos de ventas
Proceso de cambio para equipos de ventasProceso de cambio para equipos de ventas
Proceso de cambio para equipos de ventasaeaves
 
TEORIA DE LEWIS
TEORIA DE LEWISTEORIA DE LEWIS
TEORIA DE LEWISbalderasgp
 

Destaque (17)

Historia del real madrid y los mejores jugadores
Historia del real madrid y los mejores jugadoresHistoria del real madrid y los mejores jugadores
Historia del real madrid y los mejores jugadores
 
5th pic meeting es draft opening remarks tcm - clean - final
5th pic meeting es draft opening remarks   tcm - clean - final5th pic meeting es draft opening remarks   tcm - clean - final
5th pic meeting es draft opening remarks tcm - clean - final
 
Guia wgst-spring-2012-okk
Guia wgst-spring-2012-okkGuia wgst-spring-2012-okk
Guia wgst-spring-2012-okk
 
Email Marketing Trends 2009
Email Marketing Trends 2009Email Marketing Trends 2009
Email Marketing Trends 2009
 
Plan de compras 2014.
Plan de compras 2014.Plan de compras 2014.
Plan de compras 2014.
 
E!Meedia Postimees Online Jaanus Lillenberg 16.12.09
E!Meedia Postimees Online   Jaanus Lillenberg   16.12.09E!Meedia Postimees Online   Jaanus Lillenberg   16.12.09
E!Meedia Postimees Online Jaanus Lillenberg 16.12.09
 
Catalogo philips
Catalogo philipsCatalogo philips
Catalogo philips
 
Monta WordPress en tu empresa
Monta WordPress en tu empresaMonta WordPress en tu empresa
Monta WordPress en tu empresa
 
54 Mapa Guía Rutas Senderismo por el Parque Natural Urbasa
54   Mapa Guía Rutas Senderismo por el Parque Natural Urbasa54   Mapa Guía Rutas Senderismo por el Parque Natural Urbasa
54 Mapa Guía Rutas Senderismo por el Parque Natural Urbasa
 
Total Cost of Travel: More Trips, or Better Trips?
Total Cost of Travel: More Trips, or Better Trips?Total Cost of Travel: More Trips, or Better Trips?
Total Cost of Travel: More Trips, or Better Trips?
 
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1
MANUAL DE SEGURIDAD Y SALUD LABORAL, parte 1
 
Introduction to the INTERREG CENTRAL Europe Project: Semi-natural grassland...
Introduction to the INTERREG CENTRAL Europe Project:Semi-natural grassland...Introduction to the INTERREG CENTRAL Europe Project:Semi-natural grassland...
Introduction to the INTERREG CENTRAL Europe Project: Semi-natural grassland...
 
Transporte gn 2009
Transporte gn 2009Transporte gn 2009
Transporte gn 2009
 
Proceso de cambio para equipos de ventas
Proceso de cambio para equipos de ventasProceso de cambio para equipos de ventas
Proceso de cambio para equipos de ventas
 
TEORIA DE LEWIS
TEORIA DE LEWISTEORIA DE LEWIS
TEORIA DE LEWIS
 
Tarcetano noelia
Tarcetano noeliaTarcetano noelia
Tarcetano noelia
 
Situacion problema de taller de historia
Situacion problema de taller de historiaSituacion problema de taller de historia
Situacion problema de taller de historia
 

MFF Android 2 5.12.2012

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