programing

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

luckcodes 2022. 8. 11. 22:04

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

뒤로 버튼을 눌렀을 때 앱이 파괴 상태가 아닌 정지 상태로 되어 있으면 좋겠습니다.

Android 문서에는 다음과 같이 기술되어 있습니다.

모든 액티비티가 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(Music Player도 같은 방법으로 동작하기 때문에 문서의 예는 약간 오해를 불러일으킬 수 있습니다.)경우라면, 의 약면면면, 당당 if if if if if if.Activity 수 있다finish 때처럼Service는 계속 실행됩니다.

더 방법은 '', '찍다', '찍다'입니다.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경우에 따라 빠른 대안으로 사용할 수 있습니다.

참고: 아래 Dave가 지적한 바와 같이 Android 2.0은 새로운 기능을 도입했습니다.onBackPressed방법 및 로 버튼을 처리하는 방법에 대한 권장 사항을 참조하십시오.

다음 코드를 사용합니다.

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

로 버튼을 누르고 싶다면 Android Developer Blog의 게시물을 보십시오.Android 2.0에서 이를 수행하는 더 쉬운 방법과 1.x 및 2.0에서 실행되는 응용 프로그램에서 이를 수행하는 가장 좋은 방법에 대해 설명합니다.

그러나 액티비티가 Stopped(정지)인 경우에도 디바이스의 메모리 가용성에 따라 작업이 중단될 수 있습니다.UI를 사용하지 않고 프로세스를 실행하려면Service이 문서에는 서비스에 대해 다음과 같이 기재되어 있습니다.

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

이것들은, 고객의 요건에 적절한 것 같습니다.

무효화를 시도하다onBackPressed()정의되어 있습니다.액티비티 클래스

다른 사람에게 도움이 된다면, 저는 2개의 레이아웃을 사용하여 작업을 했습니다.그것들이 페이지1 > 페이지2의 구조를 에뮬레이트하려고 했습니다.그것들이 페이지2에 있고, 뒤로 버튼을 눌렀다면, 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를 큰폭으로 소비하는 다른 작업을 실시하는 것도 좋은 장소입니다.

Android 2.0 이후 onBackPressed()를 덮어씁니다.예를 들어

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

새로운 커스텀 편집 텍스트를 사용하여 @Mirko N. answser를 사용하고 있습니다.

 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);

감사합니다.

위의 모든 해결책을 시도해 보았지만, 어느 것도 효과가 없었습니다.다음 코드는 OnCreate가 호출되는 방식으로 MainActivity로 돌아가려고 할 때 도움이 되었습니다.

의도.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);
  }

언급URL : https://stackoverflow.com/questions/2000102/override-back-button-to-act-like-home-button