사용자가 현재 활동을 종료하면 홈 화면으로 돌아갈 것인지 알고 싶습니다.
사용자가 현재 활동을 종료하면 홈 화면으로 돌아갈 것인지 알고 싶습니다.
답변:
업데이트 (2015 년 7 월) :
이후 getRunningTasks () API (21)로부터 팔로우하는 것이 좋습니다, 사용되지 않는 얻을 raukodraug의 대답 이나 에드 Burnette 하나를 (내가 두 번째 선호).
ActivityManager를
사용하여 현재 작업과 스택을 확인할 수 있습니다 .
따라서 활동이 마지막 활동인지 확인하려면 :
다음 코드를 사용하십시오.
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
위의 코드는 단일 작업이있는 경우에만 유효합니다. 애플리케이션에 대한 작업 수가 존재할 가능성이있는 경우-다른 taskList 요소 를 확인해야합니다 . 작업 작업 및 백 스택 에 대해 자세히 알아보기
isTaskRoot()
.
비슷한 질문을 가진 사람들을 위해 여기 에 @ H9kDroid 의 댓글을 베스트 답변으로 게시 하겠습니다.
isTaskRoot () 를 사용 하여 활동이 작업의 루트인지 여부를 알 수 있습니다 .
이게 도움이 되길 바란다
if (isTaskRoot()) { // do something }
이것이 새로운 초보자에게 도움이되기를 바랍니다. 위의 답변을 기반으로 잘 작동하며 코드 스 니펫을 공유하여 구현하기 쉽습니다.
솔루션 : 내가 사용 isTaskRoot()
반환하는 진정한 경우 현재의 활동 만 스택에서 활동 한다면 나는 또한의 경우를 처리 이외의 내가 대신 새로운 개방의 스택의 마지막 활동 스택 이동에서 일부 활동이 사용자 정의 하나.
당신의 활동에서
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
이에 대한 가장 쉬운 해결책이 있습니다. 활동에서 isTaskRoot () 를 사용할 수 있습니다.
이것을 달성하는 방법이있을 수 있지만 (다른 답변 참조) 그렇게하지 말 것을 제안합니다. 일반 Android 애플리케이션은 홈 화면이 표시 될 것인지 여부를 알 필요가 없습니다.
데이터를 저장하려는 경우 데이터 저장 코드를 onPause () 메서드에 넣으십시오. 사용자에게 기존 애플리케이션에 대한 마음을 바꿀 수있는 방법을 제공하려는 경우 Back 키 및 onBackPressed () 메서드에 대한 키 위 / 아래를 가로 채서 "Are you sure?"를 표시 할 수 있습니다. 신속한.
이를 추적하는 한 가지 방법은 새 활동을 시작할 때 마커를 포함하고 마커가 있는지 확인하는 것입니다.
새 활동을 시작할 때마다 마커를 삽입하십시오.
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
그런 다음 다음과 같이 확인할 수 있습니다.
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
사용하는 sandrstar 솔루션의 문제점은 다음과 같습니다 ActivityManager
. 이런 방식으로 작업을 가져 오려면 권한이 필요합니다. 더 나은 방법을 찾았습니다.
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
다른 활동을하지해야하는 동안 스택 하단은에 allways 기본적으로이 범주를 받아야합니다.
그러나 이것이 일부 장치에서 실패하더라도 다음을 시작하는 동안 설정할 수 있습니다 Activity
.
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
내 모든 활동에 대한 기본 클래스를 만들고 AppCompatActivity를 확장하고 정적 카운터가 있습니다.
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
이것은 지금까지 충분히 잘 작동했습니다. 그리고 API 버전에 관계없이. 물론 모든 활동이이 기본 클래스를 확장해야합니다. 제 경우에는 그렇게합니다.
편집 : 앱이 완전히 종료되기 전에 카운터가 0으로 내려가는 경우가 하나 있는데, 이는 방향이 변경되고 하나의 활동 만 열려있는 경우입니다. 방향이 변경되면 활동이 닫히고 다른 활동이 만들어 지므로 onDestroyed
마지막 활동에 대해 onCreate
호출 된 다음 변경된 방향으로 동일한 활동이 생성 될 때 호출됩니다. 이 동작을 고려해야합니다. OrientationEventListener를 사용할 수 있습니다.
Android는 활동 스택을 구현합니다 . 여기에서 이에 대해 읽어 보시기 바랍니다 . 하지만 원하는 것은 호출 활동을 검색하는 것 getCallingActivity()
입니다. 현재 활동이 애플리케이션의 첫 번째 활동이고 애플리케이션이 홈 화면에서 시작된 경우을 반환해야합니다 null
.