Slide 1

Slide 1 text

Practical Implementation of Up Navigation Keisuke Kobayashi (@kobakei) potatotips #38

Slide 2

Slide 2 text

About me • Keisuke Kobayashi • Coubic Inc • GitHub, Qiita: @kobakei • Twitter: @ksk_kbys • Android, Rails, React

Slide 3

Slide 3 text

Up Navigation?

Slide 4

Slide 4 text

Up Back

Slide 5

Slide 5 text

Back vs Up • Back • Navigate to previous screen which may be other app • Up • Navigate to parent screen in same app

Slide 6

Slide 6 text

Example

Slide 7

Slide 7 text

EC app • Timeline > Detail • Timeline > Search > Detail • Timeline > Detail > Detail • Recommendation, similar items, … • Deep link > Detail • Notification, Google search result, …

Slide 8

Slide 8 text

Navigation Flow 5JNFMJOF 4FBSDI %FUBJM (deep link)

Slide 9

Slide 9 text

Navigation Flow 5JNFMJOF 4FBSDI %FUBJM (deep link) From search

Slide 10

Slide 10 text

Navigation Flow 5JNFMJOF 4FBSDI %FUBJM (deep link) Otherwise From search

Slide 11

Slide 11 text

How to implement?

Slide 12

Slide 12 text

Just calling 
 Activity#finish() ?

Slide 13

Slide 13 text

Calling Activity#finish() ? @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); }

Slide 14

Slide 14 text

Calling Activity#finish() ? • May be OK in simple flow • NG in Timeline > Detail > Detail flow • It opens previous Detail screen… • NG in deep link flow • It closes app…

Slide 15

Slide 15 text

OK, I will copy & paste from developer.android.com

Slide 16

Slide 16 text

developer.android.com @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); }

Slide 17

Slide 17 text

Something wrong…

Slide 18

Slide 18 text

What is wrong? 1. Recreated parent activity • Scroll position, bottom navigation etc 2. Always same parent activity regardless of where it comes from

Slide 19

Slide 19 text

What is wrong? 1. Recreated parent activity • Scroll position, bottom navigation etc 2. Always same parent activity regardless of where it comes from

Slide 20

Slide 20 text

Avoid recreating parent @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = NavUtils.getParentActivityIntent(this); upIntent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(upIntent); finish(); return true; } return super.onOptionsItemSelected(item); }

Slide 21

Slide 21 text

What is wrong? 1. Recreated parent activity • Scroll position, bottom navigation etc 2. Always same parent activity regardless of where it comes from

Slide 22

Slide 22 text

Set parent activity class to bundle extra // DetailActivity#createIntent public static Intent createIntent( @NonNull Context context, @Nullable Class extends Activity> parentClass) { Intent intent = new Intent(context, DetailActivity.class); if (parentClass != null) { intent.putExtra(KEY_PARENT, parentClass.getName()); } return intent; }

Slide 23

Slide 23 text

Restore parent activity class
 from bundle extra // Parent activity class private Class parentClass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // … String parentClassName = getIntent().getStringExtra(KEY_PARENT); if (TextUtils.isEmpty(parentClassName)) { parentClass = MainActivity.class; } else { try { parentClass = Class.forName(parentClassName); } catch (ClassNotFoundException e) { Timber.e(e); } } }

Slide 24

Slide 24 text

Create up intent with 
 parent activity class @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = new Intent(getApplicationContext(), parentClass); upIntent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(upIntent); finish(); return true; } return super.onOptionsItemSelected(item); }

Slide 25

Slide 25 text

Complete

Slide 26

Slide 26 text

Conclusion • Explained how to implement UP navigation in complex flow • Key points • FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGE_TOP • Set parent class in bundle extra and use for Intent to parent activity

Slide 27

Slide 27 text

Appendix • ͪΐͬͱෳࡶͳUPϘλϯͷ࣮૷ in Qiita • http://qiita.com/kobakei/items/ ae1a6d2062f34d3f6771 • DroidKaigi 2017 app

Slide 28

Slide 28 text

Thanks!