Slide 1

Slide 1 text

Android 1.5~8.0 Walkthrough - Retro/Prospective Android Application Development - Keishin Yokomaku (@KeithYokoma) - DevFest Tokyo 2017

Slide 2

Slide 2 text

Retro/Prospective Android Application About Me ▸ ԣນܓਅ - Keishin Yokomaku ▸ Drivemode, Inc. / Principal Engineer ▸ KeithYokoma: GitHub / Twitter / Qiita / Tumblr / Stack Overflow ▸ Books: TechBooster / Development guide for mobile app ▸ Fun: Gymnastics / Cycling / Photography / Motorsport 2

Slide 3

Slide 3 text

3 Retro/Prospective Android Application Development

Slide 4

Slide 4 text

Retro/Prospective Android Application Do you know of… 4

Slide 5

Slide 5 text

Back in time to Android 1.5 5

Slide 6

Slide 6 text

Retro/Prospective Android Application Activity Lifecycle 6 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 7

Slide 7 text

Retro/Prospective Android Application Activity Lifecycle 7 ผͷը໘͔Β໭͖ͬͯͨͱ͖ ը໘Λ࠷ॳʹ্ཱͪ͛ͨ࣌ ը໘Λดͨ͡ͱ͖ ը໘Λճసͨ͠ͱ͖… ϗʔϜϘλϯΛ͓ͨ͠ͱ͖ ผͷը໘΁ભҠͨ͠ͱ͖… ผͷΞϓϦ͔Β໭͖ͬͯͯ
 ࣗ෼ͷϓϩηε͕ࢮΜͰ͍ͨͱ͖ μΠΞϩάΛදࣔͨ͠ͱ͖ ը໘ͷҰ෦͕ޙΖʹݟ͍͑ͯΔͱ͖ 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 8

Slide 8 text

Retro/Prospective Android Application Activity Lifecycle ▸ Activity ͸ઈ͑ͣঢ়ଶ͕ભҠ͢Δ ▸ ը໘ભҠʹΑΔঢ়ଶͷભҠ ▸ ୺຤ͷঢ়ଶมԽʢճస΍ઃఆมߋͳͲʣʹΑΔঢ়ଶͷભҠ ▸ ଞͷΞϓϦͷঢ়ଶมԽʢϝϞϦͷ࢖༻ঢ়گͳͲʣʹΑΔঢ়ଶͷભҠ ▸ etc… 8 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 9

Slide 9 text

Retro/Prospective Android Application Activity Lifecycle ▸ গͳ͍ϝϞϦۭؒΛޮ཰తʹ࢖͏ͨΊͷ࢓૊Έ ▸ Ϣʔβʹݟ͍͑ͯΔ΋ͷ͕࠷΋ॏཁ ▸ Ϣʔβ͕௚ۙͰ࢖ͬͨ΋ͷ͸͙͢࠶։Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔ ▸ ࢖Θͳ͘ͳΓͦ͏ͳ΋ͷ͔ΒͲΜͲΜϝϞϦ͔Β௥͍ग़͢ ▸ ϝϞϦ͕ͨ͘͞ΜඞཁͳΞϓϦΛ࢖͏ͱ͖͸௚ۙͰ࢖ͬͨ΋ͷ΋௥͍ग़͢ 9 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 10

Slide 10 text

Retro/Prospective Android Application Activity Lifecycle ▸ ୺຤ͷઃఆ΍ঢ়ଶ(Configuration)ͷมԽʹ௥ै͠΍͘͢͢Δ࢓૊Έ ▸ ը໘͕ճసͨ͠ΒϨΠΞ΢τΛ࡞Γ௚͢ ▸ ݴޠઃఆΛม͑ͨΒݴޠϦιʔεΛಡΈ௚͢ ▸ ໷ʹͳͬͨΒը૾ϦιʔεΛಡΈ௚͢ 10 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 11

Slide 11 text

Retro/Prospective Android Application Activity Lifecycle ▸ ΞϓϦʹݻ༗ͳঢ়ଶΛ؅ཧ͢ΔͨΊͷϝιου ▸ Activity#onCreate(Bundle) ▸ Activity#onRestoreInstanceState(Bundle) ▸ Activity#onSaveInstanceState(Bundle) ▸ Activity#onRetainNonConfigurationInstance() ▸ Activity#getLastNonConfigurationInstance() 11 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 12

Slide 12 text

Retro/Prospective Android Application Activity Lifecycle and Asynchronous Task Lifecycle ▸ Http௨৴ͳͲ࣌ؒͷ͔͔Δॲཧ͸ผεϨουͰ࣮ߦ͢Δ(ඇಉظॲཧ) ▸ UI εϨουͰ࣮ߦ͢Δͱͦͷॲཧ͕ऴΘΔ·Ͱ UI ͕ૢ࡞ෆೳʹͳΔ 12 Activity Asynchronous Task 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 13

Slide 13 text

Retro/Prospective Android Application Activity Lifecycle and Asynchronous Task Lifecycle ▸ UI εϨουͰಈ͘ Activity ͱผεϨουͰಈ͘ඇಉظॲཧ͸ผͷϥΠϑαΠΫϧ ▸ Activity ͕ੜ͖͍ͯΔؒʹඇಉظॲཧ͕ऴΘΔͱ͸ݶΒͳ͍ 13 Activity Asynchronous Task Destroyed! Finish! 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 14

Slide 14 text

Retro/Prospective Android Application ඇಉظॲཧ - Before AsyncTask ▸ εϨουͰͷॲཧͱ UI ΁ͷίʔϧόοΫ͸શͯࣗ෼Ͱॻ͘ ▸ εϨουϓʔϧͳͲ΋ࣗલͰ४උ ▸ ίʔϧόοΫͷͨΊʹ Handler Λ͔ͭ͏ 14 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 15

Slide 15 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask ▸ ඇಉظॲཧͷϥΠϑαΠΫϧΛද͢ந৅Ϋϥε ▸ AsyncTask#onPreExecute(): ඇಉظॲཧͷ࣮ߦલͷίʔϧόοΫ ▸ AsyncTask#doInBackground(): ඇಉظॲཧͷத਎ ▸ AsyncTask#onPostExecute(): ඇಉظॲཧͷ࣮ߦޙͷίʔϧόοΫ ▸ εϨουͷ؅ཧ͸ AsyncTask ͕΍ͬͯ͘ΕΔ 15 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 16

Slide 16 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { static class MyAsyncTask extends AsyncTask { private WeakReference mRef; public MyAsyncTask(MyActivity activity) { mRef = new WeakReference<>(activity); } @Override public Void doInBackground(Void… args) { // do something heavy return null; } @Override public void onPostExecute(Void result) { // callback to activity } } } 16 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 17

Slide 17 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { static class MyAsyncTask extends AsyncTask { private WeakReference mRef; public MyAsyncTask(MyActivity activity) { mRef = new WeakReference<>(activity); } @Override public Void doInBackground(Void… args) { // do something heavy return null; } @Override public void onPostExecute(Void result) { // callback to activity } } } 17 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 18

Slide 18 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { static class MyAsyncTask extends AsyncTask { private WeakReference mRef; public MyAsyncTask(MyActivity activity) { mRef = new WeakReference<>(activity); } @Override public Void doInBackground(Void… args) { // do something heavy return null; } @Override public void onPostExecute(Void result) { // callback to activity } } } 18 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 19

Slide 19 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { static class MyAsyncTask extends AsyncTask { private WeakReference mRef; public MyAsyncTask(MyActivity activity) { mRef = new WeakReference<>(activity); } @Override public Void doInBackground(Void… args) { // do something heavy return null; } @Override public void onPostExecute(Void result) { // callback to activity } } } 19 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 20

Slide 20 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { static class MyAsyncTask extends AsyncTask { private WeakReference mRef; public MyAsyncTask(MyActivity activity) { mRef = new WeakReference<>(activity); } @Override public Void doInBackground(Void… args) { // do something heavy return null; } @Override public void onPostExecute(Void result) { // callback to activity } } } 20 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 21

Slide 21 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { private MyAsyncTask mTask; public void onButtonClick(View view) { if (mTask != null) return; mTask = new MyAsyncTask(this); mTask.execute(); } public void onFinishAsyncTask() { mTask = null; } } 21 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 22

Slide 22 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { private MyAsyncTask mTask; public void onButtonClick(View view) { if (mTask != null) return; mTask = new MyAsyncTask(this); mTask.execute(); } public void onFinishAsyncTask() { mTask = null; } } 22 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 23

Slide 23 text

Retro/Prospective Android Application ඇಉظॲཧ - AsyncTask public class MainActivity extends Activity { private MyAsyncTask mTask; public void onButtonClick(View view) { if (mTask != null) return; mTask = new MyAsyncTask(this); mTask.execute(); } public void onFinishAsyncTask() { mTask = null; } } 23 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 24

Slide 24 text

Retro/Prospective Android Application AsyncTask Issues ▸ Activity ͷ࣮૷ͱີ݁߹ʹͳΓ΍͔ͬͨ͢ ▸ interface Ͱղܾ ▸ ίʔϧόοΫΛऑࢀরͰอ࣋͠ͳ͍ͱϝϞϦϦʔΫ ▸ Activity ͱඇಉظॲཧͷϥΠϑαΠΫϧͷࠩҟ͸ຒΊΒΕ͍ͯͳ͍ ▸ ௕͔͔࣌ؒΔܭࢉॲཧʹ͸޲͔ͳ͍ 24 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 25

Slide 25 text

Retro/Prospective Android Application ΋͏ͻͱͭͷඇಉظॲཧ - IntentService ▸ UI ͱ͸ؔ࿈ͷͳ͍ɺόοΫάϥ΢ϯυॲཧͷͨΊͷΫϥε ▸ ؆୯ͳδϣϒΩϡʔͱͯ͠࢖͑Δ ▸ ͨͩ͠ϝϞϦ্ʹ͔͠δϣϒ͕ͳ͍ͷͰشൃ͢Δ 25 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo Activity Destroyed! IntentService Intent Destroyed!

Slide 26

Slide 26 text

Retro/Prospective Android Application ඇಉظॲཧ - IntentService public class MainIntentService extends IntentServie { public MainIntentService() { super(“MainIntentService”); } public MainIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent intent) { // ඇಉظॲཧͷத਎ } } 26 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 27

Slide 27 text

Retro/Prospective Android Application ඇಉظॲཧ - IntentService public class MainIntentService extends IntentServie { public MainIntentService() { super(“MainIntentService”); } public MainIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent intent) { // ඇಉظॲཧͷத਎ } } 27 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 28

Slide 28 text

Retro/Prospective Android Application Network I/O ▸ Apache HttpClient ▸ Apache ͕ग़͍ͯ͠Δ൚༻ͷ Http ௨৴ϥΠϒϥϦ ▸ ΍Γ͍ͨ͜ͱ͸େମͰ͖Δ ▸ ڊେ ▸ Android ͷ API ʹ૊Έࠐ·Ε͍ͯΔ 28 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 29

Slide 29 text

Retro/Prospective Android Application Network I/O ▸ Http(s)URLConnection ▸ Java ͷ API ʹ૊Έࠐ·Ε͍ͯΔ Http ௨৴ϥΠϒϥϦ ▸ γϯϓϧͰ͍ܰ ▸ Android ͷ API ʹ૊Έࠐ·Ε͍ͯΔ ▸ Froyo(Andorid 2.2)·Ͱόά͍ͬͯͨ 29 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 30

Slide 30 text

Retro/Prospective Android Application Disk I/O ▸ ϑΝΠϧʹॻ͖ग़֤͢छ API ▸ File API (java.io) ▸ SQLite ▸ SharedPreferences 30 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 31

Slide 31 text

Retro/Prospective Android Application Disk I/O ▸ SharedPreferences ʹॻ͖ࠐΉϝιου ▸ commit(): ॳظ͔Β͋ΔɻϑΝΠϧʹಉظॻ͖ࠐΈɻ ▸ apply(): Gingerbread ͔ΒɻϝϞϦʹॻ͍ͨ΋ͷΛޙͰඇಉظॻ͖ࠐΈɻ 31 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 32

Slide 32 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode ▸ ϝΠϯεϨουΛϒϩοΫ͢Δॲཧͷݕ஌ ▸ ωοτϫʔΫ௨৴ ▸ σΟεΫ I/O ▸ Ϧιʔεͷด͡๨Ε΋ݕ஌Ͱ͖Δ ▸ Closeable, Cursor ͳͲ 32 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 33

Slide 33 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode public class MyApplication extends Application { @Override public void onCreate() { if (BuildConfig.DEBUG) { StrictMode.enableDefaults(); } } } 33 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 34

Slide 34 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode public class MyApplication extends Application { @Override public void onCreate() { if (BuildConfig.DEBUG) { StrictMode.enableDefaults(); } } } 34 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 35

Slide 35 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode public class MyApplication extends Application { @Override public void onCreate() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyDeath() .build()); } } } 35 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 36

Slide 36 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode public class MyApplication extends Application { @Override public void onCreate() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyDeath() .build()); } } } 36 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 37

Slide 37 text

Retro/Prospective Android Application ύϑΥʔϚϯεͷϞχλϦϯά - StrictMode public class MyApplication extends Application { @Override public void onCreate() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyDeath() .build()); } } } 37 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 38

Slide 38 text

Retro/Prospective Android Application AsyncTask Issues ▸ Activity ͕࠶ੜ੒͞Εͨͱ͖ 38 Activity AsyncTask Destroyed! Finish! ? Activity 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 39

Slide 39 text

Retro/Prospective Android Application AsyncTask Issues ▸ Activity ͕࠶ੜ੒͞Εͨͱ͖ ▸ AsyncTask ͷΠϯελϯεΛ࠶ੜ੒ޙʹҾ͖ܧ͍ͰɺίʔϧόοΫΛ
 ઃఆ͠ͳ͓͢ ▸ Ұ౓Ωϟϯηϧͯ͠࠶ੜ੒ޙʹ΍Γͳ͓͢ 39 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 40

Slide 40 text

Retro/Prospective Android Application Loader ▸ Activity ͷϥΠϑαΠΫϧͱඇಉظॲཧͷϥΠϑαΠΫϧͷࠩҟΛϋϯυϧ͢Δ 40 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo Activity LoaderManager Destroyed! Finish! Activity Loader Cache

Slide 41

Slide 41 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { public Loader onCreateLoader(int id, Bundle args) { if (id == 0) { return new MainLoader(); } else if (id == 1) { return new SecondLoader(); } else { throw new IllegalArgumentException(“invalid id”); } } public void onLoadFinished(Loader loader, Data data) { showData(data); } public void onLoaderReset(Loader loader) { } } 41 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 42

Slide 42 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { public Loader onCreateLoader(int id, Bundle args) { if (id == 0) { return new MainLoader(); } else if (id == 1) { return new SecondLoader(); } else { throw new IllegalArgumentException(“invalid id”); } } public void onLoadFinished(Loader loader, Data data) { showData(data); } public void onLoaderReset(Loader loader) { } } 42 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 43

Slide 43 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { @Override public Loader onCreateLoader(int id, Bundle args) { if (id == 0) { return new MainLoader(); } else if (id == 1) { return new SecondLoader(); } else { throw new IllegalArgumentException(“invalid id”); } } @Override public void onLoadFinished(Loader loader, Data data) { showData(data); } @Override public void onLoaderReset(Loader loader) { } } 43 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 44

Slide 44 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { @Override public Loader onCreateLoader(int id, Bundle args) { if (id == 0) { return new MainLoader(); } else if (id == 1) { return new SecondLoader(); } else { throw new IllegalArgumentException(“invalid id”); } } @Override public void onLoadFinished(Loader loader, Data data) { showData(data); } @Override public void onLoaderReset(Loader loader) { } } 44 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 45

Slide 45 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LoaderManager loaderManager = getLoaderManager(); loaderManager.initLoader(0, new Bundle(), this); } } 45 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 46

Slide 46 text

Retro/Prospective Android Application Loader public class MainActivity extends Activity implements LoaderCallbacks { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LoaderManager loaderManager = getLoaderManager(); loaderManager.initLoader(0, new Bundle(), this); } } 46 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 47

Slide 47 text

Retro/Prospective Android Application Fragment 47 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 48

Slide 48 text

Retro/Prospective Android Application Fragment ▸ ໨త ▸ ࢖͍·Θ͢͜ͱͷͰ͖Δ UI ͷ·ͱ·Γ ▸ UI Λ΋ͨͳ͍Ϟδϡʔϧ ▸ Activity ͷϥΠϑαΠΫϧͱಉظͯ͠ಈ͘ 48 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 49

Slide 49 text

Retro/Prospective Android Application Fragment 49 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 50

Slide 50 text

Retro/Prospective Android Application UI Λ·ͱΊΔ Fragment ▸ େ͖ͳը໘Ͱ͸ϚϧνϖΠϯ(λϒϨοτ) ▸ খ͞ͳը໘Ͱ͸υϩϫʔϝχϡʔ(ϋϯυηοτ) 50 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo FRAGMENT A FRAGMENT B FRAGMENT B

Slide 51

Slide 51 text

Retro/Prospective Android Application UI Λ·ͱΊΔ Fragment ▸ େ͖ͳը໘Ͱ͸ϚϧνϖΠϯ(λϒϨοτ) ▸ খ͞ͳը໘Ͱ͸υϩϫʔϝχϡʔ(ϋϯυηοτ) 51 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo FRAGMENT A FRAGMENT B FRAGMENT B FRAGMENT A

Slide 52

Slide 52 text

Retro/Prospective Android Application UI Λ࣋ͨͳ͍ Fragment ▸ setRetainInstance(true) ▸ Activity ͷ࠶ੜ੒Λ௒͑ͯσʔλΛอ͍࣋ͨ͠৔໘Ͱ࢖͏ 52 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 53

Slide 53 text

Retro/Prospective Android Application Fragment ▸ Do ✓ Fragment ੜ੒࣌ʹσʔλΛ౉͢ͱ͖͸ setArguments Λ࢖͏ ✓ ίʔϧόοΫ͸ Fragment#onAttach Ͱઃఆ͢Δ ▸ Don’t ✗ σʔλ΍ίʔϧόοΫΛ setter ΍ίϯετϥΫλͰઃఆ͢Δ 53 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 54

Slide 54 text

Retro/Prospective Android Application Support Libraries ▸ ৽͍͠ API Level ͷ API Λݹ͍ API Level ΁όοΫϙʔτ͢ΔϥΠϒϥϦ ▸ v4 Support Library, v7 AppCompat Library, etc… ▸ Fragment ͸ Support Libraries ʹؚ·ΕΔ΋ͷΛ࢖͏ ▸ όάϑΟΫε͕഑৴͞ΕΔ 54 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 55

Slide 55 text

Starting from Lollipop… 55

Slide 56

Slide 56 text

Retro/Prospective Android Application Android 5.x (API Level 21 ~ 22) ▸ Material Design ▸ Android RunTime(ART) ▸ JobSchedulers and GcmNetworkManager(Firebase JobDispatcher) 56 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 57

Slide 57 text

Retro/Prospective Android Application JobSchedulers and GcmNetworkManager(Firebase JobDispatcher) ▸ ΞϓϦέʔγϣϯͷϓϩηε಺ͰδϣϒΛ࣮ߦ͢ΔͨΊͷϑϨʔϜϫʔΫ ▸ όοΫάϥ΢ϯυͰಈ࡞͢Δ͞·͟·ͳॲཧͷ࣮ߦΛίϯτϩʔϧ͢Δ ▸ ঢ়گΛݟͯϑϨʔϜϫʔΫ͕Α͠ͳʹ࣮ߦλΠϛϯάΛݟܭΒͬͯ͘ΕΔ ▸ ઀ଓ͍ͯ͠ΔωοτϫʔΫͷछྨ(ैྔ՝͔ۚͲ͏͔ɺͳͲ) ▸ લճࣦഊ͔࣌ΒͷόοΫΦϑ 57 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 58

Slide 58 text

Retro/Prospective Android Application JobSchedulers and GcmNetworkManager(Firebase JobDispatcher) ▸ όοΫάϥ΢ϯυॲཧʹΑΔόοςϦʔফඅΛ཈͑ΔͨΊͷ͘͠Έ ▸ Service ͕όοΫάϥ΢ϯυͰಈ࡞͚ͭͮ͠Δ͜ͱΛආ͚Δ ▸ ωοτϫʔΫ઀ଓ͕ྑ͘ͳ͍ঢ়گͰෆඞཁʹ௨৴ΛࢼΈΔ͜ͱΛආ͚Δ 58 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 59

Slide 59 text

Retro/Prospective Android Application Doze ▸ όοςϦʔফඅΛ཈͑ΔͨΊͷ͘͠Έୈೋ஄ ▸ ը໘͕෇͍͍ͯͳ͍ɾॆిதͰͳ͍࣌ʹൃಈ͢ΔϞʔυ ▸ ఆظతʹόοΫάϥ΢ϯυॲཧΛ࣮ߦՄೳͳׂ͕࣌ؒΓ౰ͯΒΕΔ ▸ ϝϯςφϯε΢Οϯυ΢ ▸ AlarmManager ΍ JobScheduler, SyncAdapter ͷॲཧ΋ӨڹΛड͚Δ ▸ WakeLock ΋ແࢹ 59 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 60

Slide 60 text

Retro/Prospective Android Application Doze Enhancements ▸ Marshmallow ͷ Doze ͸σόΠεΛ࣋ͪาؒ͘͸ൃಈ͠ͳ͔ͬͨ ▸ σόΠε͕੩ࢭதʹ Doze ͕ൃಈ͢Δͱ CPU ΋εϦʔϓ͢ΔΑ͏ʹͳͬͨ ▸ WakeLock ▸ AlarmManager ▸ GPS/WiFi Scan 60 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 61

Slide 61 text

Retro/Prospective Android Application Background Limits ▸ Execution Limits ͱ Location Limits ▸ Execution: Service ͱ Broadcast ͷ੍ݶ ▸ IntentService ΋ӨڹΛड͚Δ -> JobIntentService ▸ Location: Ґஔ৘ใͷ੍ݶ 61 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 62

Slide 62 text

Retro/Prospective Android Application چདྷͷ API ͷந৅Խ ▸ RecyclerView ▸ Architecture Components 62 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 63

Slide 63 text

Retro/Prospective Android Application RecyclerView ▸ ListView ΍ GridView ͷந৅Խ ▸ ViewHolder ύλʔϯʹΑΔ Adapter ͷ࣮૷ ▸ ΧελϚΠζͷͨΊͷ API ▸ LayoutManager ▸ SnapHelper 63 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 64

Slide 64 text

Retro/Prospective Android Application ArchitectureComponents ▸ ϥΠϑαΠΫϧͷந৅Խ ▸ Activity ΍ Fragment, Service ͳͲ -> LifecyclerOwner ▸ ϥΠϑαΠΫϧʹ࿈ಈ͢΂͖Ϋϥε -> LifecycleObserver ▸ UI ʹඥͮ͘σʔλΛ؅ཧ͢ΔΫϥε -> ViewModel 64 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 65

Slide 65 text

Retro/Prospective Android Application ArchitectureComponents ▸ ϥΠϑαΠΫϧͷந৅Խ ▸ มԽ͠ଓ͚ΔσʔλͱϥΠϑαΠΫϧͷඥ෇͚ -> LiveData ▸ େ͖ͳσʔληοτͷϖʔδωʔγϣϯ -> Paging Library 65 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 66

Slide 66 text

Retro/Prospective Android Application ArchitectureComponents public class MainActivity extends AppCompatActivity { private MainViewModel mViewModel; private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.hello_world); mViewModel = ViewModelProviders.of(this).get(MainViewModel.class); mTextView.setText(mViewModel.getSomething()); } } 66 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 67

Slide 67 text

Retro/Prospective Android Application ArchitectureComponents public class MainActivity extends AppCompatActivity { private MainViewModel mViewModel; private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.hello_world); mViewModel = ViewModelProviders.of(this).get(MainViewModel.class); mTextView.setText(mViewModel.getSomething()); } } 67 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 68

Slide 68 text

Retro/Prospective Android Application ArchitectureComponents public class MainActivity extends AppCompatActivity { private MainViewModel mViewModel; private TextView mTextView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = findViewById(R.id.hello_world); mViewModel = ViewModelProviders.of(this).get(MainViewModel.class); mTextView.setText(mViewModel.getSomething()); } } 68 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 69

Slide 69 text

Retro/Prospective Android Application ArchitectureComponents public class MainViewModel extends AndroidViewModel { public MainViewModel(Application application) { super(application); } public String getSomething() { return “Hello World!”; } @Override // Automatically called when Activity is destroyed public void onCleared() { super.onCleared(); Log.d(“MainViewModel”, “onCleared!”); } } 69 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 70

Slide 70 text

Retro/Prospective Android Application ArchitectureComponents public class MainViewModel extends AndroidViewModel { public MainViewModel(Application application) { super(application); } public String getSomething() { return “Hello World!”; } @Override // Automatically called when Activity is destroyed public void onCleared() { super.onCleared(); Log.d(“MainViewModel”, “onCleared!”); } } 70 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 71

Slide 71 text

Retro/Prospective Android Application ArchitectureComponents public class MainViewModel extends AndroidViewModel { public MainViewModel(Application application) { super(application); } public String getSomething() { return “Hello World!”; } @Override // Automatically called when Activity is destroyed public void onCleared() { super.onCleared(); Log.d(“MainViewModel”, “onCleared!”); } } 71 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 72

Slide 72 text

Retro/Prospective Android Application ArchitectureComponents public class MainViewModel extends AndroidViewModel { public MainViewModel(Application application) { super(application); } public String getSomething() { return “Hello World!”; } @Override // Automatically called when Activity is destroyed public void onCleared() { super.onCleared(); Log.d(“MainViewModel”, “onCleared!”); } } 72 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 73

Slide 73 text

·ͱΊ 73

Slide 74

Slide 74 text

Retro/Prospective Android Application ·ͱΊ ▸ API ͷϕʔε͸ 1.0 ͷࠒ͔Β΄΅͓ͳ͡ ▸ ը໘΍ඇಉظॲཧͷϥΠϑαΠΫϧ͸΄΅มΘ͍ͬͯͳ͍ ▸ Activity, Fragment ▸ Thread with Handler -> AsyncTask -> AsyncTaskLoader ▸ ୺຤ͷਐԽʹͱ΋ͳͬͯΞϓϦ΋ਐԽ͍ͯ͠ΔͷͰলϝϞϦ͸ࠓͳ͓ॏཁ ▸ JobScheduler and GcmNetworkManager(Firebase JobDispatcher) 74 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 75

Slide 75 text

Retro/Prospective Android Application ·ͱΊ ▸ API ͷෳࡶ͞ͱ෇͖߹͏ํ๏͕૿͖͑ͯͨ ▸ ඇಉظॲཧͷந৅Խ: AsyncTask, AsyncTaskLoader ▸ ϥΠϑαΠΫϧͷந৅Խ: ArchitectureComponents ▸ View ͷந৅Խ: RecyclerView ▸ RxJava ΍ͦΕΛϕʔεʹͨ͠ Flux ͳͲɺ୅ସखஈ΋͋Δ 75 1.0 1.1 Cupcake Donut Eclair Froyo Gingerbread Honeycomb Ice Cream Sandwich Jelly Bean Kitkat Lollipop Marshmallow Nougat Oreo

Slide 76

Slide 76 text

Keishin Yokomaku (@KeithYokoma) - DevFest Tokyo 2017 Android 1.5~8.0 Walkthrough - Retro/Prospective Android Application Development -