출처: http://king9.tistory.com/41
앱을 나갔다 왔을때 비밀번호를 입력하는 엑티비티 수행후 원래 동작으로 하던 도중 생긴 문제.
사용자가 앱을 나갔음을 알때는 Activity의 onUserLeaveHint()로 찾게 되는데 이게 다른 액티비티로 넘어갈때도
onPause()전에 onUserLeaveHint()를 수행하게 된다.
Activity_onUserLeaveHint_Test.zip
MainActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MainActivity extends BaseActivity { private NotificationManager mNM; private Notification mNoti; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClickGotoNext(View v) { Log.i(tag, String.format( onClickButton %s" , ((Button)v).getText())); Intent intent = new Intent( this , AActivity. class ); // intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); startActivity(intent); } } |
AActivity
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class AActivity extends BaseActivity { ActivityAnim anim = ActivityAnim.getInstance(); private NotificationManager mNM; private Notification mNoti; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); getActionBar().setDisplayHomeAsUpEnabled( true ); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask( this ); return true ; case R.id.action_settings: return true ; } return super .onOptionsItemSelected(item); } public void onClickGotoNext(View v) { Log.i(tag, String.format( onClickButton %s" , ((Button)v).getText())); Intent intent = new Intent( this , BActivity. class ); // intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); startActivity(intent); } } |
해당 로그는 이렇게 나온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 01 - 21 16 : 30 : 15.168 : I/com.example.activitytest.MainActivity( 30799 ): onCreate 01 - 21 16 : 30 : 15.182 : I/com.example.activitytest.MainActivity( 30799 ): onStart 01 - 21 16 : 30 : 15.182 : I/com.example.activitytest.MainActivity( 30799 ): onResume 01 - 21 16 : 30 : 17.435 : I/com.example.activitytest.MainActivity( 30799 ): onUserInteraction 01 - 21 16 : 30 : 17.510 : I/com.example.activitytest.MainActivity( 30799 ): onClickButton gotoNextActivity 01 - 21 16 : 30 : 17.517 : I/com.example.activitytest.MainActivity( 30799 ): onUserInteraction 01 - 21 16 : 30 : 17.517 : I/com.example.activitytest.MainActivity( 30799 ): onUserLeaveHint 01 - 21 16 : 30 : 17.517 : I/com.example.activitytest.MainActivity( 30799 ): onPause 01 - 21 16 : 30 : 17.537 : I/com.example.activitytest.AActivity( 30799 ): onCreate 01 - 21 16 : 30 : 17.552 : I/com.example.activitytest.AActivity( 30799 ): onStart 01 - 21 16 : 30 : 17.553 : I/com.example.activitytest.AActivity( 30799 ): onResume 01 - 21 16 : 30 : 18.002 : I/com.example.activitytest.MainActivity( 30799 ): onStop 01 - 21 16 : 30 : 22.217 : I/com.example.activitytest.AActivity( 30799 ): onUserInteraction 01 - 21 16 : 30 : 22.278 : I/com.example.activitytest.AActivity( 30799 ): onClickButton gotoNextActivity 01 - 21 16 : 30 : 22.286 : I/com.example.activitytest.AActivity( 30799 ): onUserInteraction 01 - 21 16 : 30 : 22.286 : I/com.example.activitytest.AActivity( 30799 ): onUserLeaveHint 01 - 21 16 : 30 : 22.286 : I/com.example.activitytest.AActivity( 30799 ): onPause 01 - 21 16 : 30 : 22.303 : I/com.example.activitytest.BActivity( 30799 ): onCreate 01 - 21 16 : 30 : 22.311 : I/com.example.activitytest.BActivity( 30799 ): onStart 01 - 21 16 : 30 : 22.313 : I/com.example.activitytest.BActivity( 30799 ): onResume 01 - 21 16 : 30 : 22.778 : I/com.example.activitytest.AActivity( 30799 ): onStop |
MainActivity에서 AActivity로 갈때 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 01 - 21 16 : 32 : 41.153 : I/com.example.activitytest.MainActivity( 32554 ): onCreate 01 - 21 16 : 32 : 41.188 : I/com.example.activitytest.MainActivity( 32554 ): onStart 01 - 21 16 : 32 : 41.188 : I/com.example.activitytest.MainActivity( 32554 ): onResume 01 - 21 16 : 32 : 42.633 : I/com.example.activitytest.MainActivity( 32554 ): onUserInteraction 01 - 21 16 : 32 : 42.695 : I/com.example.activitytest.MainActivity( 32554 ): onClickButton gotoNextActivity 01 - 21 16 : 32 : 42.701 : I/com.example.activitytest.MainActivity( 32554 ): onPause 01 - 21 16 : 32 : 42.725 : I/com.example.activitytest.AActivity( 32554 ): onCreate 01 - 21 16 : 32 : 42.737 : I/com.example.activitytest.AActivity( 32554 ): onStart 01 - 21 16 : 32 : 42.737 : I/com.example.activitytest.AActivity( 32554 ): onResume 01 - 21 16 : 32 : 43.183 : I/com.example.activitytest.MainActivity( 32554 ): onStop 01 - 21 16 : 32 : 46.079 : I/com.example.activitytest.AActivity( 32554 ): onUserInteraction 01 - 21 16 : 32 : 46.136 : I/com.example.activitytest.AActivity( 32554 ): onClickButton gotoNextActivity 01 - 21 16 : 32 : 46.142 : I/com.example.activitytest.AActivity( 32554 ): onUserInteraction 01 - 21 16 : 32 : 46.142 : I/com.example.activitytest.AActivity( 32554 ): onUserLeaveHint 01 - 21 16 : 32 : 46.142 : I/com.example.activitytest.AActivity( 32554 ): onPause 01 - 21 16 : 32 : 46.160 : I/com.example.activitytest.BActivity( 32554 ): onCreate 01 - 21 16 : 32 : 46.167 : I/com.example.activitytest.BActivity( 32554 ): onStart 01 - 21 16 : 32 : 46.167 : I/com.example.activitytest.BActivity( 32554 ): onResume 01 - 21 16 : 32 : 46.619 : I/com.example.activitytest.AActivity( 32554 ): onStop |
AActivity에서 BActivity로 갈때 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 01 - 21 16 : 34 : 10.100 : I/com.example.activitytest.MainActivity( 1379 ): onCreate 01 - 21 16 : 34 : 10.119 : I/com.example.activitytest.MainActivity( 1379 ): onStart 01 - 21 16 : 34 : 10.119 : I/com.example.activitytest.MainActivity( 1379 ): onResume 01 - 21 16 : 34 : 11.118 : I/com.example.activitytest.MainActivity( 1379 ): onUserInteraction 01 - 21 16 : 34 : 11.222 : I/com.example.activitytest.MainActivity( 1379 ): onClickButton gotoNextActivity 01 - 21 16 : 34 : 11.228 : I/com.example.activitytest.MainActivity( 1379 ): onUserInteraction 01 - 21 16 : 34 : 11.228 : I/com.example.activitytest.MainActivity( 1379 ): onUserLeaveHint 01 - 21 16 : 34 : 11.228 : I/com.example.activitytest.MainActivity( 1379 ): onPause 01 - 21 16 : 34 : 11.241 : I/com.example.activitytest.AActivity( 1379 ): onCreate 01 - 21 16 : 34 : 11.259 : I/com.example.activitytest.AActivity( 1379 ): onStart 01 - 21 16 : 34 : 11.259 : I/com.example.activitytest.AActivity( 1379 ): onResume 01 - 21 16 : 34 : 11.703 : I/com.example.activitytest.MainActivity( 1379 ): onStop 01 - 21 16 : 34 : 12.489 : I/com.example.activitytest.AActivity( 1379 ): onUserInteraction 01 - 21 16 : 34 : 12.565 : I/com.example.activitytest.AActivity( 1379 ): onClickButton gotoNextActivity 01 - 21 16 : 34 : 12.571 : I/com.example.activitytest.AActivity( 1379 ): onPause 01 - 21 16 : 34 : 12.578 : I/com.example.activitytest.BActivity( 1379 ): onCreate 01 - 21 16 : 34 : 12.587 : I/com.example.activitytest.BActivity( 1379 ): onStart 01 - 21 16 : 34 : 12.587 : I/com.example.activitytest.BActivity( 1379 ): onResume 01 - 21 16 : 34 : 13.023 : I/com.example.activitytest.AActivity( 1379 ): onStop |
둘다 Intent.FLAG_ACTIVITY_NO_USER_ACTION을 추가했을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 01 - 21 16 : 35 : 03.262 : I/com.example.activitytest.MainActivity( 2464 ): onCreate 01 - 21 16 : 35 : 03.280 : I/com.example.activitytest.MainActivity( 2464 ): onStart 01 - 21 16 : 35 : 03.280 : I/com.example.activitytest.MainActivity( 2464 ): onResume 01 - 21 16 : 35 : 04.340 : I/com.example.activitytest.MainActivity( 2464 ): onUserInteraction 01 - 21 16 : 35 : 04.418 : I/com.example.activitytest.MainActivity( 2464 ): onClickButton gotoNextActivity 01 - 21 16 : 35 : 04.424 : I/com.example.activitytest.MainActivity( 2464 ): onPause 01 - 21 16 : 35 : 04.439 : I/com.example.activitytest.AActivity( 2464 ): onCreate 01 - 21 16 : 35 : 04.450 : I/com.example.activitytest.AActivity( 2464 ): onStart 01 - 21 16 : 35 : 04.452 : I/com.example.activitytest.AActivity( 2464 ): onResume 01 - 21 16 : 35 : 04.891 : I/com.example.activitytest.MainActivity( 2464 ): onStop 01 - 21 16 : 35 : 06.135 : I/com.example.activitytest.AActivity( 2464 ): onUserInteraction 01 - 21 16 : 35 : 06.152 : I/com.example.activitytest.AActivity( 2464 ): onClickButton gotoNextActivity 01 - 21 16 : 35 : 06.162 : I/com.example.activitytest.AActivity( 2464 ): onPause 01 - 21 16 : 35 : 06.177 : I/com.example.activitytest.BActivity( 2464 ): onCreate 01 - 21 16 : 35 : 06.184 : I/com.example.activitytest.BActivity( 2464 ): onStart 01 - 21 16 : 35 : 06.184 : I/com.example.activitytest.BActivity( 2464 ): onResume 01 - 21 16 : 35 : 06.618 : I/com.example.activitytest.AActivity( 2464 ): onStop |
결과를 정리하면
ParentActivity에서 ChildActivity를 부를때 Intent에 No_User_Action을 추가하면 ParentActivity가 onPause() 되기전에 onUserLeaveHint()가 호출되지 않는다! ParentActivity에서 home key나 recent key를 누를경우는 정상적으로 onUserLeaveHint()가 호출된다. |
안드로이드 레퍼런스에서 설명되어 있는 FLAG_ACTIVITY_NO_USER_ACTION는 다음과 같다.
If set, this flag will prevent the normal onUserLeaveHint() callback from occurring on the current frontmost activity
before it is paused as the newly-started activity is brought to the front.
설정할 경우, 이 플래그는 새로운 액티비티(자식)가 앞으로 와서 가장 최근의 액티비티(부모)가 paused하기 전에 발생하는
onUserLeaveHint() 콜백을 방지한다.
Typically, an activity can rely on that callback to indicate that an explicit user action has caused their activity to be moved out of the foreground. The callback marks an appropriate point in the activity's lifecycle for it to dismiss any notifications that it intends to display "until the user has seen them," such as a blinking LED.
일반적으로 사용자의 행동으로 인해 해당 액티비티가 foreground에서 background로 이동했다는 것을 알리기 위해 onUserLeaveHint()콜백에 의존한다.
이 콜백은 액티비티 라이프사이클 안에서 사용자가 그들을 볼때까지 보여지는 것으로 계획되어 있던 알림(LED 깜빡이기 등)을 지우기 위한
적당한 지점을 표시한다.
p.s.) 알림을 지우는 조건이 어떤 Activity를 통해서 알림내용을 보는것 이라면 해당 액티비티의 onUserLeaveHint()에서 알림을 지우라는 뜻 같다.
If an activity is ever started via any non-user-driven events such as phone-call receipt or an alarm handler, this flag should be passed to Context.startActivity,
ensuring that the pausing activity does not think the user has acknowledged its notification.
만약 액티비티가 전화 수신 혹은 알람 같은 사용자가 하지 않은 이벤트를 통해서 시작 된다면, 이 플래그는 Context.startActivity를 통해 전달된다.
일시정지된 액티비티는 사용자가 그 통지를 인정했다고 생각하지 않는다.
Constant Value: 262144 (0x00040000)
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_USER_ACTION
HOME키를 가로챌 수는 없지만, HOME키가 눌렸는 지 여부는 확인 할 수 있습니다. 해당 Activity의 startActivity (startActivityForResult..) / finish / startService 등을 override하여 해당 task가 유지되는 case를 제외하고, onUserInteraction / onUserLeaveHint 등을 override하여 시스템에서 task를 switch하는 case (전화수신등)을 제외하고, onPause / onStop 에서 HOME키가 눌렸다고 볼 수 있습니다. |
'IT_Programming > Android_Java' 카테고리의 다른 글
Android Studio 새로운 메모리 분석 도구를 품다! (Hello!! Allocation Tracker) (0) | 2015.11.16 |
---|---|
오디오 포커스에 대하여 (0) | 2015.11.10 |
[펌] Android 6.0 마시멜로 리뷰 (0) | 2015.10.29 |
[펌] 리사이클러 뷰(RecyclerView) Header / Footer 붙이기 (0) | 2015.10.28 |
[펌] ListView 스크롤 위치 저장 및 복원 (0) | 2015.10.27 |