[java] 홈 버튼처럼 작동하도록 뒤로 버튼 재정의

뒤로 버튼을 누르면 응용 프로그램이 파괴 된 상태가 아닌 중지 된 상태로 가고 싶습니다.

Android 문서 에서는 다음과 같이 말합니다.

… 모든 활동이 BACK을 눌렀을 때 파괴되는 동작을 갖는 것은 아닙니다. 사용자가 Music 응용 프로그램에서 음악 재생을 시작한 다음 BACK을 누르면 응용 프로그램이 정상적인 뒤로 동작을 무시하여 플레이어 활동이 손상되지 않도록하고 활동이 더 이상 보이지 않더라도 음악을 계속 재생합니다.

내 응용 프로그램에서이 기능을 어떻게 복제합니까?

나는 세 가지 가능성이 있어야한다고 생각합니다 …

  1. 뒤로 버튼 누름 (아래 참조)을 캡처 한 다음 홈 버튼 호출 방법을 호출하십시오.

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Log.d(this.getClass().getName(), "back button pressed");
        }
        return super.onKeyDown(keyCode, event);
    }
  2. 뒤로 버튼 누름을 캡처 한 다음 홈 버튼 누름을 스푸핑하십시오.

  3. 뒤로 버튼 누름을 캡처 한 다음 홈 화면의 활동을 시작하여 효과적으로 애플리케이션의 활동을 중지 상태로 만듭니다.

편집 :
서비스에 대해 알고 있으며이 문제와 관련된 응용 프로그램에서 서비스를 사용하고 있습니다. 이 질문은 특히 뒤로 버튼을 눌렀을 때 활동이 파괴 된 상태가 아닌 중지 된 상태로 전환되는 것에 관한 것입니다.



답변

대부분의 경우 백그라운드에서 무언가를 수행하기 위해 서비스 를 작성해야하며 , 사용자가 Activity단순히이를 제어합니다 Service. (뮤직 플레이어가 같은 방식으로 작동한다고 확신하므로 문서의 예제는 약간 오해의 소지가 있습니다.) 그렇다면 일반적인 경우 처럼 Activity캔 이 계속 실행됩니다.finishService

보다 간단한 방법은 Back버튼 누름 을 캡처하고 다음과 같이 moveTaskToBack (true) 를 호출 하는 것입니다.

// 2.0 and above
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

// Before 2.0
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

선호하는 옵션은 활동이 정상적으로 끝나고 필요한 경우 서비스에서 현재 상태를 읽는 것과 같이 스스로를 다시 만들 수 있어야한다고 생각합니다. 그러나 moveTaskToBack경우에 따라 빠른 대안으로 사용할 수 있습니다.

참고 : Android 2.0 아래에서 Dave가 지적한 것처럼 새로운 onBackPressed방법이 도입되었으며 뒤로 버튼을 처리하는 방법에 대한 권장 사항이 도입되었습니다 .


답변

다음 코드를 사용하십시오.

public void onBackPressed() {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}


답변

뒤로 버튼을 잡으려면 Android 개발자 블로그에서이 게시물을 살펴보십시오 . Android 2.0에서이 작업을 수행하는 가장 쉬운 방법과 1.x 및 2.0에서 실행되는 응용 프로그램에서이 작업을 수행하는 가장 좋은 방법을 다룹니다.

그러나 활동이 중지 된 경우 디바이스의 메모리 가용성에 따라 여전히 종료 될 수 있습니다. UI없이 프로세스를 실행하려면을 만들어야합니다 Service. 설명서에는 서비스에 대한 다음 내용이 나와 있습니다.

서비스에는 시각적 사용자 인터페이스가 없지만 무한정 백그라운드에서 실행됩니다. 예를 들어, 서비스는 사용자가 다른 사안에 참석할 때 배경 음악을 재생하거나 네트워크를 통해 데이터를 가져 오거나 무언가를 계산하여 필요한 활동에 결과를 제공 할 수 있습니다.

이것은 귀하의 요구 사항에 적합한 것 같습니다.


답변

onBackPressed()android.app.Activity 클래스에 정의 된 void를 재정의하십시오 .


답변

그것이 다른 사람에게 도움이된다면, 2 가지 레이아웃이있는 활동을 보았습니다. 그들이 2 페이지에 있었고 뒤로 버튼을 누르면 1 페이지로 돌아 가기를 원했습니다. 1 페이지에서 뒤로 버튼을 누르면 여전히 정상적으로 작동합니다. 꽤 기본이지만 작동합니다.

@Override
public void onBackPressed() {
// check if page 2 is open
    RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout);
    if(page2layout.getVisibility() == View.VISIBLE){
        togglePageLayout(); // my method to toggle the views
        return;
    }else{
        super.onBackPressed(); // allows standard use of backbutton for page 1
    }

}

그것이 누군가를 돕는 희망, 건배


답변

실례 ..

super.onBackPressed ();를 호출하지 마십시오.

@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}

이런 식으로 뒤로 단추는 홈 단추처럼 작동합니다. 활동을 끝내지 않지만 배경으로 가져갑니다.

두 번째 방법은 호출하는 것입니다 moveTaskToBack(true);에서 onBackPressed제거해야합니다super.onBackPressed


답변

더 나은 것은 OnPause ()어떻습니까 ?

활동이 백그라운드로 진행되지만 아직 종료되지 않은 경우 활동 라이프 사이클의 일부로 호출됩니다. onResume ()에 해당합니다.

액티비티 B가 액티비티 A 앞에서 시작되면이 콜백이 A에서 호출됩니다. A의 onPause ()가 반환 될 때까지 B는 생성 enter code here되지 않으므로 여기에서 긴 작업을 수행하지 마십시오.

이 콜백은 주로 활동이 편집중인 지속적 상태를 저장하고 먼저이 활동을 종료하지 않고 새 활동을 시작할 수있는 자원이 충분하지 않은 경우 손실이 없는지 확인하는 데 주로 사용됩니다.

또한 가능한 빨리 다음 활동으로 전환하거나 카메라와 같은 독점 액세스 권한이있는 리소스를 닫기 위해 애니메이션 중지 및 눈에 띄는 양의 CPU를 소비하는 기타 작업을 수행하기에 좋은 장소입니다.