MFF Android 2 5.12.2012

1,040 views

Published on

2nd lecture of Mo

Published in: Technology
  • Be the first to comment

  • Be the first to like this

MFF Android 2 5.12.2012

  1. 1. Android 2 Ondra Zahradník MFF - 5.12.2012Wednesday, December 5, 2012
  2. 2. AgendaWednesday, December 5, 2012
  3. 3. Agenda 1. Rekapitulace z minulaWednesday, December 5, 2012
  4. 4. Agenda 1. Rekapitulace z minula 2. BroadcastReceiverWednesday, December 5, 2012
  5. 5. Agenda 1. Rekapitulace z minula 2. BroadcastReceiver 3. Podpora různých zařízeníWednesday, December 5, 2012
  6. 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. 7. Agenda 1. Rekapitulace z minula 2. BroadcastReceiver 3. Podpora různých zařízení 4. Dynamické UI pomocí fragmentů 5. PřestávkaWednesday, December 5, 2012
  8. 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é aplikaceWednesday, December 5, 2012
  9. 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ědiWednesday, December 5, 2012
  10. 10. House-keeping notes • slajdy - http://goo.gl/2siyO • zdroje - http://goo.gl/HqMIs • vaše otázkyWednesday, December 5, 2012
  11. 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. DebuggingWednesday, December 5, 2012
  12. 12. BroadcastyWednesday, December 5, 2012
  13. 13. Broadcasty • Aplikace reaguje na důležité událostiWednesday, December 5, 2012
  14. 14. Broadcasty • Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas...Wednesday, December 5, 2012
  15. 15. Broadcasty • Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... • BroadcastReceiverWednesday, December 5, 2012
  16. 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. 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. 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. 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. 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
  21. 21. PříkladWednesday, December 5, 2012
  22. 22. Příklad • Vypište číslo a text příchozí sms v toastuWednesday, December 5, 2012
  23. 23. Příklad • Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTkWednesday, December 5, 2012
  24. 24. Příklad • Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMSWednesday, December 5, 2012
  25. 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 smsekWednesday, December 5, 2012
  26. 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.createFromPduWednesday, December 5, 2012
  27. 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átoruWednesday, December 5, 2012
  28. 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-helloWednesday, December 5, 2012
  29. 29. Zdroje a kvalifikátoryWednesday, December 5, 2012
  30. 30. Zdroje a kvalifikátory • ZdrojeWednesday, December 5, 2012
  31. 31. Zdroje a kvalifikátory • Zdroje • texty, obrázky, layout, barvy,...Wednesday, December 5, 2012
  32. 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.xmlWednesday, December 5, 2012
  33. 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. 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. 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. 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. 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. 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.pngWednesday, December 5, 2012
  39. 39. Resource resolvingWednesday, December 5, 2012
  40. 40. Resource resolvingWednesday, December 5, 2012
  41. 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. 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 = 12keyWednesday, December 5, 2012
  43. 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. 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. 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
  46. 46. Různé obrazovkyWednesday, December 5, 2012
  47. 47. Různé obrazovky • obrazovky small, normal, large, xlargeWednesday, December 5, 2012
  48. 48. Různé obrazovky • obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayoutWednesday, December 5, 2012
  49. 49. Různé obrazovky • obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchWednesday, December 5, 2012
  50. 50. Různé obrazovky • obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchWednesday, December 5, 2012
  51. 51. Různé obrazovky • obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchWednesday, December 5, 2012
  52. 52. Různé hustotyWednesday, December 5, 2012
  53. 53. Různé hustotyWednesday, December 5, 2012
  54. 54. Různé hustotyWednesday, December 5, 2012
  55. 55. Různé hustotyWednesday, December 5, 2012
  56. 56. Různé hustoty • hustoty ldpi, mdpi, hdpi, xhdpiWednesday, December 5, 2012
  57. 57. Různé hustoty • hustoty ldpi, mdpi, hdpi, xhdpiWednesday, December 5, 2012
  58. 58. Různé hustoty • hustoty ldpi, mdpi, hdpi, xhdpi • xhdpi: 2.0 • hdpi: 1.5 • mdpi: 1.0 (baseline) • ldpi: 0.75Wednesday, December 5, 2012
  59. 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.pngWednesday, December 5, 2012
  60. 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 pixelWednesday, December 5, 2012
  61. 61. Podpora různých verzíWednesday, December 5, 2012
  62. 62. Podpora různých verzí • Na trhu Android v2.1 - v4.0.3Wednesday, December 5, 2012
  63. 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. 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 were 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. 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/RKihTWednesday, December 5, 2012
  66. 66. Různá zařízeníWednesday, December 5, 2012
  67. 67. Různá zařízení • deklarativně podadresáři v /resWednesday, December 5, 2012
  68. 68. Různá zařízení • deklarativně podadresáři v /res • defaultní a alternativníWednesday, December 5, 2012
  69. 69. Různá zařízení • deklarativně podadresáři v /res • defaultní a alternativní dvě zařízení jeden layoutWednesday, December 5, 2012
  70. 70. Různá zařízení • deklarativně podadresáři v /res • defaultní a alternativní dvě zařízení jeden layout jedno zařízení dva layoutyWednesday, December 5, 2012
  71. 71. Dynamické UI pomocí fragmentů • Fragment je kus funkčního UI • Aktivita hostí fragmenty • Jedna aplikace pro telefon i tabletWednesday, December 5, 2012
  72. 72. FragmentWednesday, December 5, 2012
  73. 73. FragmentWednesday, December 5, 2012
  74. 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. 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. 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. 77. Fragmenty na telefonu a tabletuWednesday, December 5, 2012
  78. 78. Fragmenty na telefonu a tabletuWednesday, December 5, 2012
  79. 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. 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. 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
  82. 82. Komunikace mezi fragmentyWednesday, December 5, 2012
  83. 83. Komunikace mezi fragmentyWednesday, December 5, 2012
  84. 84. Komunikace mezi fragmenty • FragmentA definuje Listener interfaceWednesday, December 5, 2012
  85. 85. Komunikace mezi fragmenty • FragmentA definuje Listener interface • Activity interface implementujeWednesday, December 5, 2012
  86. 86. Komunikace mezi fragmenty • FragmentA definuje Listener interface • Activity interface implementuje • FragmentA volá callback onItemSelected(...)Wednesday, December 5, 2012
  87. 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 • AnimationsWednesday, December 5, 2012
  88. 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/bK5GQWednesday, December 5, 2012
  89. 89. PřestávkaWednesday, December 5, 2012
  90. 90. Motivace -rychlé appkyWednesday, December 5, 2012
  91. 91. Motivace -rychlé appky • Nechceme čekat, když čekámeWednesday, December 5, 2012
  92. 92. Motivace -rychlé appky • Nechceme čekat, když čekáme • Chceme rychlé appkyWednesday, December 5, 2012
  93. 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. 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. 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 taskyWednesday, December 5, 2012
  96. 96. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  97. 97. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  98. 98. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  99. 99. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  100. 100. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  101. 101. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  102. 102. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  103. 103. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  104. 104. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  105. 105. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  106. 106. Příklad - Corkbin pro iOS a AndroidWednesday, December 5, 2012
  107. 107. Omezený programovací modelWednesday, December 5, 2012
  108. 108. Omezený programovací model • Slabý procesorWednesday, December 5, 2012
  109. 109. Omezený programovací model • Slabý procesor • Opravdový multi-taskingWednesday, December 5, 2012
  110. 110. Omezený programovací model • Slabý procesor • Opravdový multi-tasking • “Application not responding” aka. ANRWednesday, December 5, 2012
  111. 111. Omezený programovací model • Slabý procesor • Opravdový multi-tasking • “Application not responding” aka. ANR • Aktualizace UI pouze v ui threaduWednesday, December 5, 2012
  112. 112. Omezený programovací model • Slabý procesor • Opravdový multi-tasking • “Application not responding” aka. ANR • Aktualizace UI pouze v ui threadu • UI žije jenom chvíliWednesday, December 5, 2012
  113. 113. Architektura typické aplikace 1 • Zobraz seznam položek z databázeWednesday, December 5, 2012
  114. 114. Architektura typické aplikace 1 • Zobraz seznam položek z databáze ListFragmentWednesday, December 5, 2012
  115. 115. Architektura typické aplikace 1 • Zobraz seznam položek z databáze čte data ListFragment DBWednesday, December 5, 2012
  116. 116. Architektura typické aplikace 1 • Zobraz seznam položek z databáze čte data ListFragment DB sqlWednesday, December 5, 2012
  117. 117. Architektura typické aplikace 1 • Zobraz seznam položek z databáze UI čte data ListFragment DB sqlWednesday, December 5, 2012
  118. 118. Architektura typické aplikace 1 • Zobraz seznam položek z databáze UI Model čte data ListFragment DB sqlWednesday, December 5, 2012
  119. 119. DatabázeWednesday, December 5, 2012
  120. 120. Databáze • SQLite v3 databázeWednesday, December 5, 2012
  121. 121. Databáze • SQLite v3 databáze • SQLiteOpenHelperWednesday, December 5, 2012
  122. 122. Databáze • SQLite v3 databáze • SQLiteOpenHelper • stará se o life-cycle databázeWednesday, December 5, 2012
  123. 123. Databáze • SQLite v3 databáze • SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgradeWednesday, December 5, 2012
  124. 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. 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ázeWednesday, December 5, 2012
  126. 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. 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. 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
  129. 129. CursorWednesday, December 5, 2012
  130. 130. Cursor • zpřístupňuje řádky výsledku db.query()Wednesday, December 5, 2012
  131. 131. Cursor • zpřístupňuje řádky výsledku db.query() • metody pro pohybWednesday, December 5, 2012
  132. 132. Cursor • zpřístupňuje řádky výsledku db.query() • metody pro pohyb • moveToFirst(), moveToNext(), getCount()Wednesday, December 5, 2012
  133. 133. Cursor • zpřístupňuje řádky výsledku db.query() • metody pro pohyb • moveToFirst(), moveToNext(), getCount() • metody pro čteníWednesday, December 5, 2012
  134. 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. 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. 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. 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, CursorAdapterWednesday, December 5, 2012
  138. 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/eme2aWednesday, December 5, 2012
  139. 139. Architektura typické aplikace 2 • Zobraz seznam položek z databázeWednesday, December 5, 2012
  140. 140. Architektura typické aplikace 2 • Zobraz seznam položek z databáze ListFragmentWednesday, December 5, 2012
  141. 141. Architektura typické aplikace 2 • Zobraz seznam položek z databáze ListFragment poskytuje data ContentProviderWednesday, December 5, 2012
  142. 142. Architektura typické aplikace 2 • Zobraz seznam položek z databáze ListFragment poskytuje data uri ContentProviderWednesday, December 5, 2012
  143. 143. Architektura typické aplikace 2 • Zobraz seznam položek z databáze ListFragment poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  144. 144. Architektura typické aplikace 2 • Zobraz seznam položek z databáze UI ListFragment poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  145. 145. Architektura typické aplikace 2 • Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sqlWednesday, December 5, 2012
  146. 146. Architektura typické aplikace 2 • Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sql BoilerplateWednesday, December 5, 2012
  147. 147. ContentProviderWednesday, December 5, 2012
  148. 148. ContentProvider • Jednotné API pro přístup k modeluWednesday, December 5, 2012
  149. 149. ContentProvider • Jednotné API pro přístup k modelu • Zapouzdřuje CRUD operace nad databázíWednesday, December 5, 2012
  150. 150. ContentProvider • Jednotné API pro přístup k modelu • Zapouzdřuje CRUD operace nad databází • REST-like api a systém URIWednesday, December 5, 2012
  151. 151. ContentProvider • Jednotné API pro přístup k modelu • Zapouzdřuje CRUD operace nad databází • REST-like api a systém URI • Řeší synchronizaciWednesday, December 5, 2012
  152. 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ímWednesday, December 5, 2012
  153. 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/EFKK7Wednesday, December 5, 2012
  154. 154. Architektura typické aplikace 3 • Zobraz seznam položek z databázeWednesday, December 5, 2012
  155. 155. Architektura typické aplikace 3 • Zobraz seznam položek z databáze ListFragmentWednesday, December 5, 2012
  156. 156. Architektura typické aplikace 3 • Zobraz seznam položek z databáze ListFragment načítání dat CursorLoaderWednesday, December 5, 2012
  157. 157. Architektura typické aplikace 3 • Zobraz seznam položek z databáze ListFragment načítání dat callbacky CursorLoaderWednesday, December 5, 2012
  158. 158. Architektura typické aplikace 3 • Zobraz seznam položek z databáze ListFragment načítání dat callbacky CursorLoader poskytuje data ContentProviderWednesday, December 5, 2012
  159. 159. Architektura typické aplikace 3 • Zobraz seznam položek z databáze ListFragment načítání dat callbacky CursorLoader poskytuje data uri ContentProviderWednesday, December 5, 2012
  160. 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 DBWednesday, December 5, 2012
  161. 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 sqlWednesday, December 5, 2012
  162. 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 sqlWednesday, December 5, 2012
  163. 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 sqlWednesday, December 5, 2012
  164. 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 sqlWednesday, December 5, 2012
  165. 165. Asynchroní operaceWednesday, December 5, 2012
  166. 166. Asynchroní operace • Omezený programovací modelWednesday, December 5, 2012
  167. 167. Asynchroní operace • Omezený programovací model • slabý procesorWednesday, December 5, 2012
  168. 168. Asynchroní operace • Omezený programovací model • slabý procesor • multi-taskingWednesday, December 5, 2012
  169. 169. Asynchroní operace • Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threaduWednesday, December 5, 2012
  170. 170. Asynchroní operace • Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANRWednesday, December 5, 2012
  171. 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íliWednesday, December 5, 2012
  172. 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 threadWednesday, December 5, 2012
  173. 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á komunikaceWednesday, December 5, 2012
  174. 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ázeWednesday, December 5, 2012
  175. 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émuWednesday, December 5, 2012
  176. 176. CursorLoaderWednesday, December 5, 2012
  177. 177. CursorLoader • Čte z ContentProvideru na pozadíWednesday, December 5, 2012
  178. 178. CursorLoader • Čte z ContentProvideru na pozadí • Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset()Wednesday, December 5, 2012
  179. 179. CursorLoader • Čte z ContentProvideru na pozadí • Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() • Umí reusovat jednou nahraný CursorWednesday, December 5, 2012
  180. 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 modeluWednesday, December 5, 2012
  181. 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() getActivityWednesday, December 5, 2012
  182. 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/BBb2NWednesday, December 5, 2012
  183. 183. Architektura typické aplikace 4 • Aktualizace z internetuWednesday, December 5, 2012
  184. 184. Architektura typické aplikace 4 • Aktualizace z internetu ListFragment načítání dat callbacky CursorLoader poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  185. 185. Architektura typické aplikace 4 • Aktualizace z internetu UI ListFragment načítání dat callbacky CursorLoader poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  186. 186. Architektura typické aplikace 4 • Aktualizace z internetu UI ListFragment načítání dat callbacky CursorLoader poskytuje data uri Model čte data ContentProvider DB sqlWednesday, December 5, 2012
  187. 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 sqlWednesday, December 5, 2012
  188. 188. Architektura typické aplikace 4 • Aktualizace z internetu ListFragment IntentService Intent načítání dat callbacky CursorLoader poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  189. 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 sqlWednesday, December 5, 2012
  190. 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 sqlWednesday, December 5, 2012
  191. 191. IntentServiceWednesday, December 5, 2012
  192. 192. IntentService • Implementuje frontu tasků za zpracovaníWednesday, December 5, 2012
  193. 193. IntentService • Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i)Wednesday, December 5, 2012
  194. 194. IntentService • Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) • Impl. pomocí HandlerThread a HandlerWednesday, December 5, 2012
  195. 195. IntentService • Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) • Impl. pomocí HandlerThread a Handler • Třeba definovat v manifestuWednesday, December 5, 2012
  196. 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. 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
  198. 198. SíťováníWednesday, December 5, 2012
  199. 199. Síťování • Http Client, UrlConnectionWednesday, December 5, 2012
  200. 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. 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. 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.INTERNETWednesday, December 5, 2012
  203. 203. Parsování a db insertWednesday, December 5, 2012
  204. 204. Parsování a db insert • JSON - JSONObject, JSONArrayWednesday, December 5, 2012
  205. 205. Parsování a db insert • JSON - JSONObject, JSONArray • getString(), getInt(), getDouble()Wednesday, December 5, 2012
  206. 206. Parsování a db insert • JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() • XMLWednesday, December 5, 2012
  207. 207. Parsování a db insert • JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() • XML • android.util.XMLWednesday, December 5, 2012
  208. 208. Parsování a db insert • JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() • XML • android.util.XML • android.sax.RootElementWednesday, December 5, 2012
  209. 209. Parsování a db insert • JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() • XML • android.util.XML • android.sax.RootElement • ContentValuesWednesday, December 5, 2012
  210. 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. 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. 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/3EeeWednesday, December 5, 2012
  213. 213. Architektura typické aplikace 5 • Operace create, update, deleteWednesday, December 5, 2012
  214. 214. Architektura typické aplikace 5 • Operace create, update, delete ListFragment načítání dat callbacky CursorLoader poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  215. 215. Architektura typické aplikace 5 • Operace create, update, delete UI ListFragment načítání dat callbacky CursorLoader poskytuje data uri čte data ContentProvider DB sqlWednesday, December 5, 2012
  216. 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 sqlWednesday, December 5, 2012
  217. 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 sqlWednesday, December 5, 2012
  218. 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 sqlWednesday, December 5, 2012
  219. 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 sqlWednesday, December 5, 2012
  220. 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 sqlWednesday, December 5, 2012
  221. 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 sqlWednesday, December 5, 2012
  222. 222. AsyncQueryHandlerWednesday, December 5, 2012
  223. 223. AsyncQueryHandler • Volá crud operace v threadu na pozadíWednesday, December 5, 2012
  224. 224. AsyncQueryHandler • Volá crud operace v threadu na pozadí • Zpětně notifikuje volajícíhoWednesday, December 5, 2012
  225. 225. AsyncQueryHandler • Volá crud operace v threadu na pozadí • Zpětně notifikuje volajícího • Problém - volající nemusí již existovatWednesday, December 5, 2012
  226. 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. 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-levelWednesday, December 5, 2012
  228. 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íhoWednesday, December 5, 2012
  229. 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. 230. Příklad 1. Doplňte c, u, d operace do provideru a fragmentu • zdrojáky • mff-android-5 • dokumentace • http://goo.gl/BS1hrWednesday, December 5, 2012
  231. 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.5Wednesday, December 5, 2012

×