안드로이드의
Seamless UX를 위한
Activity 활용전략
Android앱팀 I 오종인
이런 얘기를 하려고 합니다




    01 Android vs. iOS

    02 Application, Activity, Task

    03 기본 동작 Review

    04 Case Study

2
무엇이 무엇이 똑같을까?




3
진정 이런 것을 원하세요?




4
02 Application, Activity, Task
Application 구조부터 달라요!




        Application            Application

                                 Process

    기능&화면       기능&화면
                          Activity             Activity



            기능&화면
                             Content Provider



                                     Service
    기능&화면       기능&화면




6
Application 구조부터 달라요!




                             Application

                               Process


                 화면     Activity             Activity


    화면과 기능의 분리
                           Content Provider

                 기능
                                   Service




7
Activity는?




    public class Calculator extends Activity




8
잠시 다른 얘기…




9
Application을 종료하고 싶어요~




10
이렇게 하면 된대요!




     Process.killProcess(Process.myPid());



     System.exit(0);



     ((ActivityManager)getSystemService(ACTIVITY_SERVICE))
        .restartPackage(getPackageName());


11
그런데, 왜 종료해야 하나요?




     안드로이드가 알아서 !



     Low Memory Killer !

12
종료에 대해서 신경 끄세요!




                1
                    모바일 앱 사용 패턴은
     최근 사용한 앱
                    소수의 앱을 반복적으로


                2
                    Application은
                    항상 실행 중인 상태라는
                    경험을 제공


13
찾아보세요!



            Phone
          Application


     Message    Browser   Settings



            E-mail

14
동작을 이해해 보아요~

     Activity Test        Activity Test        Activity Test            Activity Test


         Activity 1           Activity 2           Activity 3               Activity 2

       Start Activity 2     Start Activity 3     Start Activity 4          Start Activity 3




         Activity 1           Activity 2           Activity 3               Activity 3

                              Activity 1           Activity 2               Activity 2

                                                   Activity 1               Activity 1


     Activity는 Stack에 쌓임                                            TASK
15
남의 어플에 숟가락 얹기



           Application                        Application

             Process                            Process



     Activity 1     Activity 3   Task   Activity 2     Activity 4




        Content Provider                   Content Provider


                                                           Activity 3
              Service                            Service
                                                           Activity 2

                                                           Activity 1

16
복잡해요, Launch Mode


     Launch mode에 의해서 다양한 동작으로 구성 가능




     ☞ standard, singleTask, singleTop, singleInstance
17
그런데, 이럴 때 필요합니다.




               1
                   Notification에서
                   Activity 실행 시 고려 필수

     페북 메신저!   2
                   새로운 Activity 생성
                   또는
                   실행 중인 Activity를 사용


18
facebook 메신저를 살펴 보아요~



     1
         대화 상대 목록은 재사용


     2
         채팅 진행 중인 화면은
         재사용

     3
         신규 채팅 화면은
         새로운 Activity 생성

19
03 기본 동작 Review
벌써 잊으셨어요? 원래 있던 건데..


          MENU




           BACK




21
보이는 모양이 바뀐 것일 뿐...


     Option Menu
                   1
                       화면에서 실행할 수 있는
                       추가 기능 목록


                   2
                       사용자가 기대하는 기능을
                       메뉴 키를 눌렀을 때
                       찾을 수 있도록 배치

22
문맥(=Context) 이라 굽쇼?


     Context Menu
                    1
                        목록에서
                        상세 화면 진입 없이
                        선택 항목의 관련기능 수행




23
빠른 접촉? 교제?


     Quick Contact
                     1
                         프로필 이미지 선택 시,
                         연락처 관련 기능의
                         빠른 수행

                     2
                         연락처 기능 외에
                         Quick Action으로
                         부가 기능 수행도 가능

24
04 Case Study
브라우저를 비교해 볼까요?




26
종료는 앞서 말씀 드렸죠? 정말 쓸데없는 짓!




27
팝업의 감동을 알려드립니다~




28
Seesmic을 아시나요?



     1
         재 실행 시 이전 상태로
         빠르게 복원
     2
         Menu, Context Menu 등
         기본 동작에 충실

     3
         탄탄한 시나리오,
         이미지 대신 색을 이용

29
많이 쓰고 계시죠? handcent SMS app




     임시보관함   1
                 사용자 데이터 유실 없음




             2
                 위젯의 효과적 사용,
                 정보 제공 및
                 단축 아이콘 기능 수행

30
기억나시나요? “네이버-다음 구글 공정위 제소…”




31
기억나시나요? “네이버-다음 구글 공정위 제소…”




     <activity android:name=".EmployeeSearch“>
         <!-- Receives the search request. -->
         <intent-filter>
             <action android:name="android.intent.action.SEARCH" />
             <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>

         <!-- Points to searchable meta data. -->
         <meta-data android:name="android.app.searchable“
                    android:resource="@xml/searchable"/>
     </activity>


     <provider android:name="MruNameProvider"
                     android:authorities="kth_employee_name_mru"/>
32
검색 동작을 자세히 살펴보면…


         Android Search                    KTH 직원검색 App




                                                          Activity 4
                                 Task
     Activity 3     Activity 1          Activity 2       Activity 4




         Task
                                             Content Provider
      Activity 2

      Activity 1

33
나는 꼽사리다! “공유” 기능!




     <activity android:name=".MyShare">
         <intent-filter>
             <action android:name="android.intent.action.SEND"/>
             <category android:name="android.intent.category.DEFAULT"/>
             <data android:mimeType="image/*"/>
             <data android:mimeType="video/*"/>
             <data android:mimeType="text/plain" />
         </intent-filter>
     </activity>
34
facebook 거저먹기 : Single Sign On




35
facebook 거저먹기 II




     String uri = "fb://page/" + yourFBpageId;
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));

     try {
        startActivity(intent);
     } catch (ActivityNotFoundException ex) {
        // facebook 공식 앱이 존재하지 않을 경우에는
        // Web browser로 동일 화면을 보여준다.
        String uri = "http://touch.facebook.com/pages/x/" + yourFBpageId;
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        startActivity(i);
     }



36
접속해 보세요~ : OpenIntents.org




37
참고 하세요~


     Title           Action

     프린트             com.rcreations.send2printer.print


     소리 크기 조절        org.openintents.audio.action_volume_update


     색깔 선택           org.openintents.action.PICK_COLOR


     바코드 스캔          com.google.zxing.client.android.SCAN


     Flickr photo    com.google.android.photostream.FLICKR_PHOTO


     Flickr stream   com.google.android.photostream.FLICKR_STREAM


38
바코드 스캔




http://www.openintents.org/en/node/679


39
저희부터 할께요!




40
무찌르자 애플!!!! 타도 애플!!!




41
각자의 길로 가는 게 좋겠죠?




42
밑줄 쫙~




     1


     Application은
     항상 실행 중인 상태라는
     경험을 제공
      사용자에게는 기능의 연속성이 중요함
      Activity 재 실행 시 마지막 상태를 최대한 복원
      Low Memory Killer에 의한 종료 시나리오에 대비

43
똥글뱅이!




     2


     Android 기본 동작 준수
      [MENU], [BACK]키 동작
      Option Menu, Context Menu, Quick Contact 등
       적절하게 사용
      Low Memory Killer에 의한 종료 시나리오에 대비




44
형광펜!




     3


     사용자 알림은 용도에 맞게
        POP-UP은 불가피한 경우만
        중요한 이벤트에 사용자 대응이 꼭 필요한 경우
        사용자 입력 데이터 유실 문제가 있을 때
        Toast는 focus를 뺏지는 않지만
         어떤 동작에 대한 안내인지 명시적으로 표시



45
이것도!




     4


     Search, Share 등
     사용자가 예상하는 경로에
     기능 배치


46
One more thing!




     5


     동일 서비스일 지라도
     iOS와 Android의 UX는
     별도로 접근


47
감사합니다.
모바일개발실 / Android앱팀 팀장 / 오종인
      ohjongin@kthcorp.com
              @ji5

H3 2011 안드로이드의 Seamless UX를 위한 Activity 활용전략_Android팀_오종인

  • 1.
    안드로이드의 Seamless UX를 위한 Activity활용전략 Android앱팀 I 오종인
  • 2.
    이런 얘기를 하려고합니다 01 Android vs. iOS 02 Application, Activity, Task 03 기본 동작 Review 04 Case Study 2
  • 3.
  • 4.
    진정 이런 것을원하세요? 4
  • 5.
  • 6.
    Application 구조부터 달라요! Application Application Process 기능&화면 기능&화면 Activity Activity 기능&화면 Content Provider Service 기능&화면 기능&화면 6
  • 7.
    Application 구조부터 달라요! Application Process 화면 Activity Activity 화면과 기능의 분리 Content Provider 기능 Service 7
  • 8.
    Activity는? public class Calculator extends Activity 8
  • 9.
  • 10.
  • 11.
    이렇게 하면 된대요! Process.killProcess(Process.myPid()); System.exit(0); ((ActivityManager)getSystemService(ACTIVITY_SERVICE)) .restartPackage(getPackageName()); 11
  • 12.
    그런데, 왜 종료해야하나요? 안드로이드가 알아서 ! Low Memory Killer ! 12
  • 13.
    종료에 대해서 신경끄세요! 1 모바일 앱 사용 패턴은 최근 사용한 앱 소수의 앱을 반복적으로 2 Application은 항상 실행 중인 상태라는 경험을 제공 13
  • 14.
    찾아보세요! Phone Application Message Browser Settings E-mail 14
  • 15.
    동작을 이해해 보아요~ Activity Test Activity Test Activity Test Activity Test Activity 1 Activity 2 Activity 3 Activity 2 Start Activity 2 Start Activity 3 Start Activity 4 Start Activity 3 Activity 1 Activity 2 Activity 3 Activity 3 Activity 1 Activity 2 Activity 2 Activity 1 Activity 1 Activity는 Stack에 쌓임 TASK 15
  • 16.
    남의 어플에 숟가락얹기 Application Application Process Process Activity 1 Activity 3 Task Activity 2 Activity 4 Content Provider Content Provider Activity 3 Service Service Activity 2 Activity 1 16
  • 17.
    복잡해요, Launch Mode Launch mode에 의해서 다양한 동작으로 구성 가능 ☞ standard, singleTask, singleTop, singleInstance 17
  • 18.
    그런데, 이럴 때필요합니다. 1 Notification에서 Activity 실행 시 고려 필수 페북 메신저! 2 새로운 Activity 생성 또는 실행 중인 Activity를 사용 18
  • 19.
    facebook 메신저를 살펴보아요~ 1 대화 상대 목록은 재사용 2 채팅 진행 중인 화면은 재사용 3 신규 채팅 화면은 새로운 Activity 생성 19
  • 20.
  • 21.
    벌써 잊으셨어요? 원래있던 건데.. MENU BACK 21
  • 22.
    보이는 모양이 바뀐것일 뿐... Option Menu 1 화면에서 실행할 수 있는 추가 기능 목록 2 사용자가 기대하는 기능을 메뉴 키를 눌렀을 때 찾을 수 있도록 배치 22
  • 23.
    문맥(=Context) 이라 굽쇼? Context Menu 1 목록에서 상세 화면 진입 없이 선택 항목의 관련기능 수행 23
  • 24.
    빠른 접촉? 교제? Quick Contact 1 프로필 이미지 선택 시, 연락처 관련 기능의 빠른 수행 2 연락처 기능 외에 Quick Action으로 부가 기능 수행도 가능 24
  • 25.
  • 26.
  • 27.
    종료는 앞서 말씀드렸죠? 정말 쓸데없는 짓! 27
  • 28.
  • 29.
    Seesmic을 아시나요? 1 재 실행 시 이전 상태로 빠르게 복원 2 Menu, Context Menu 등 기본 동작에 충실 3 탄탄한 시나리오, 이미지 대신 색을 이용 29
  • 30.
    많이 쓰고 계시죠?handcent SMS app 임시보관함 1 사용자 데이터 유실 없음 2 위젯의 효과적 사용, 정보 제공 및 단축 아이콘 기능 수행 30
  • 31.
  • 32.
    기억나시나요? “네이버-다음 구글공정위 제소…” <activity android:name=".EmployeeSearch“> <!-- Receives the search request. --> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- Points to searchable meta data. --> <meta-data android:name="android.app.searchable“ android:resource="@xml/searchable"/> </activity> <provider android:name="MruNameProvider" android:authorities="kth_employee_name_mru"/> 32
  • 33.
    검색 동작을 자세히살펴보면… Android Search KTH 직원검색 App Activity 4 Task Activity 3 Activity 1 Activity 2 Activity 4 Task Content Provider Activity 2 Activity 1 33
  • 34.
    나는 꼽사리다! “공유”기능! <activity android:name=".MyShare"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> <data android:mimeType="text/plain" /> </intent-filter> </activity> 34
  • 35.
    facebook 거저먹기 :Single Sign On 35
  • 36.
    facebook 거저먹기 II String uri = "fb://page/" + yourFBpageId; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); try { startActivity(intent); } catch (ActivityNotFoundException ex) { // facebook 공식 앱이 존재하지 않을 경우에는 // Web browser로 동일 화면을 보여준다. String uri = "http://touch.facebook.com/pages/x/" + yourFBpageId; Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(i); } 36
  • 37.
    접속해 보세요~ :OpenIntents.org 37
  • 38.
    참고 하세요~ Title Action 프린트 com.rcreations.send2printer.print 소리 크기 조절 org.openintents.audio.action_volume_update 색깔 선택 org.openintents.action.PICK_COLOR 바코드 스캔 com.google.zxing.client.android.SCAN Flickr photo com.google.android.photostream.FLICKR_PHOTO Flickr stream com.google.android.photostream.FLICKR_STREAM 38
  • 39.
  • 40.
  • 41.
  • 42.
    각자의 길로 가는게 좋겠죠? 42
  • 43.
    밑줄 쫙~ 1 Application은 항상 실행 중인 상태라는 경험을 제공  사용자에게는 기능의 연속성이 중요함  Activity 재 실행 시 마지막 상태를 최대한 복원  Low Memory Killer에 의한 종료 시나리오에 대비 43
  • 44.
    똥글뱅이! 2 Android 기본 동작 준수  [MENU], [BACK]키 동작  Option Menu, Context Menu, Quick Contact 등 적절하게 사용  Low Memory Killer에 의한 종료 시나리오에 대비 44
  • 45.
    형광펜! 3 사용자 알림은 용도에 맞게  POP-UP은 불가피한 경우만  중요한 이벤트에 사용자 대응이 꼭 필요한 경우  사용자 입력 데이터 유실 문제가 있을 때  Toast는 focus를 뺏지는 않지만 어떤 동작에 대한 안내인지 명시적으로 표시 45
  • 46.
    이것도! 4 Search, Share 등 사용자가 예상하는 경로에 기능 배치 46
  • 47.
    One more thing! 5 동일 서비스일 지라도 iOS와 Android의 UX는 별도로 접근 47
  • 48.
    감사합니다. 모바일개발실 / Android앱팀팀장 / 오종인 ohjongin@kthcorp.com @ji5