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


253

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

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

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


답변:


338

대부분의 경우 백그라운드에서 무언가를 수행하기 위해 서비스 를 작성해야하며 , 사용자가 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방법이 도입되었으며 뒤로 버튼을 처리하는 방법에 대한 권장 사항이 도입되었습니다 .


1
moveTaskToBack ()이 원하는대로 작동하는 것으로 보입니다. 이 방법을 사용하면 어떤 단점이 있습니까? 이것이 예상대로 작동하지 않을 수있는 경우가 있습니까?
bdls

1
문서를보다 신중하게 읽은 후에 실제로 제대로 작동한다고 생각합니다. (처음에는 이것이 활동에 적용되었다고 생각했지만 실제로는 "이 활동을 포함하는 작업"이라고합니다.) 물론 직접 테스트해야합니다. :)
Mirko N.

감사합니다 Mirko, 그 방법은 잘 작동하는 것 같습니다. 나중에이 질문을보고있는 사람들에 대한 답변 맨 아래에 편집 내용이 더 눈에 띄면 멋질 수 있습니다.
bdls

4
읽어 보시기 바랍니다 android-developers.blogspot.com/2009/12/... 뒤로 키를 처리하기 위해 권장되는 방법을.
hackbod

1
이론적으로 @bdls는 백그라운드 리소스가 부족한 시스템에 의해 백그라운드 활동이 중단 될 수 있으므로 안전하기 위해서는 어쨌든 스스로를 다시 만들 수 있어야합니다. Android Music 앱의 소스 코드를 보았는데 특별한 뒤로 버튼 처리가 보이지 않습니다.
Mirko N.

46

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

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

23

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

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

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

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



14

그것이 다른 사람에게 도움이된다면, 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
    }

}

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


10

실례 ..

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


0

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

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

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

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

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


0

안드로이드 2.0 이후 onBackPressed ()를 재정의하십시오. 와 같은

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

0

위의 모든 솔루션을 시도했지만 그중 아무것도 나를 위해 일하지 않았습니다. onCreate가 호출되는 방식으로 MainActivity로 돌아 가려고 할 때 다음 코드가 도움이되었습니다.

Intent.FLAG_ACTIVITY_CLEAR_TOP이 열쇠입니다.

  @Override
  public void onBackPressed() {
      Intent intent = new Intent(this, MainActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
  }

-1

@Mirko N. Answser를 사용하여 새로운 Custom EditText를 만들었습니다.

 public class EditViewCustom extends EditText {

    Button cancelBtn;
    RelativeLayout titleReleLayout;
    public EditViewCustom(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public EditViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditViewCustom(Context context) {
        super(context);
    }

    public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){
        this.cancelBtn = cancelBtn;
        this.titleReleLayout = titleReleLayout;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            Log.d("KEYCODE_BACK","KEYCODE_BACK");
            cancelBtn.setVisibility(View.GONE);
            this.setFocusableInTouchMode(false);
            this.setFocusable(false);
            titleReleLayout.setVisibility(View.VISIBLE);

            return super.onKeyPreIme(keyCode, event);
          }

        return super.onKeyPreIme(keyCode, event);
    }

}

그런 다음 활동에서 데이터를 설정하십시오.

 searchEditView.setViews(cancelBtn, titleRelativeLayout);

감사합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.