Android-“뒤로”버튼을 재정 의하여 내 활동을 완료하지 못하도록하는 방법은 무엇입니까?


199

현재 알림이 표시되면 알림 표시 줄에도 알림이 표시되는 활동이 있습니다.

이것은 사용자가 집을 누르고 활동이 배경으로 밀릴 때 알림을 통해 활동으로 돌아갈 수 있도록하기위한 것입니다.

사용자가 뒤로 버튼을 누르면 문제가 발생하지만 내 활동이 손상되지만 사용자가 뒤로 밀 수는 있지만 알림을 통해 여전히 활동에 도달 할 수 있도록 알림은 유지됩니다. 그러나 USER가 이것을 시도하면 Null Pointers가 이전 활동을 다시 가져 오는 대신 새로운 활동을 시작하려고 시도합니다.

본질적으로 뒤로 버튼이 홈 버튼과 똑같이 작동하기를 원하며 여기에 내가 지금까지 시도한 방법이 있습니다.


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

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

            return;
        }   

그러나 위의 코드는 여전히 내 활동을 파괴 할 수있는 것처럼 보입니다. 뒤로 버튼을 누를 때 활동이 파괴되는 것을 어떻게 막을 수 있습니까?


비슷한 질문이 있습니다 : stackoverflow.com/questions/2459848/…
aleung


또한 코드를`if (Integer.parseInt (android.os.Build.VERSION.SDK)> 5 , the <`로 변경해야한다고 생각합니다 >.
SudoPlz

1
이 문제를 해결하더라도 시스템이 앱을 종료시킬 가능성을 여전히 처리해야합니다. 나는 null 케이스가 여전히 가능하다는 것을 의미합니까? 또는 시스템이 어떤 이유로 앱을 종료하는 경우 알림도 제거됩니까? 알림의 목적은 앱이없는 경우에도 존재하기 때문에 이것이 문제가 될 것이라고 생각합니다.
ToolmakerSteve

예제 애플리케이션 코드 확인 freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

답변:


276

키 리스너를 제거하거나 true가지고 있으면 돌아옵니다 KEY_BACK.

뒤로 키를 잡으려면 다음이 필요합니다 ( super in 을 호출하지 마십시오 onBackPressed()).

또한 백그라운드에서 서비스를 실행하려는 경우 startForeground()알림을 계속 확인해야합니다. 그렇지 않으면 메모리를 확보해야하는 경우 Android에서 서비스를 종료합니다.

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

70

한 줄의 코드로만 구현하는 것이 더 쉬웠습니다.

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

이것이 정답입니다. 이것은 질문이 요구하는 것을 정확하게하고 깨끗한 내장 기능을 사용하고 있습니다.
Shadoninja

고맙습니다 :) 당신은 그 뒤에 개념을 정교하게 할 수 있습니까?
Farrukh Faizy

1
단순히 onBackPressed () 이벤트를 재정 의하여 활동을 뒤로 이동시킵니다.
다람쥐

1
이 솔루션은 홈 화면에서 앱을 다시 시작할 때 (작업 스택에 다른 활동이있는 경우) 활동을 다시 가져 오지 않습니다.
IgorGanapolsky

12

나는 당신이 원하는 것은 뒤로 버튼을 재정의하는 것이 아니라 좋은 생각처럼 보이지 않습니다-안드로이드 OS는 그 동작을 정의하고 왜 변경합니까?) 활동 수명주기 를 사용하고 설정 / 데이터를 onSaveInstanceState (Bundle) 이벤트.

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

그런 다음 onCreate (Bundle) 을 사용 하여 지속 된 번들에서 모든 것을 꺼내고 상태를 다시 만듭니다.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

올바른 방향을 가리 키도록 위의 의사 코드를 고려하십시오. Activity Lifecycle을 읽으면 원하는 것을 달성하는 가장 좋은 방법을 결정하는 데 도움이됩니다.


안녕하세요 Kiswa, 이것은 사실입니다. 기본 동작을 변경하고 싶지 않습니다. onSavedInstanceState를 사용하려고 시도했지만 작동하지 않았지만 지금 내 오류를 발견했다고 생각합니다. 감사합니다
Donal Rafferty 2016 년

5
실제로 새로운 활동을 시작하지 않고 표준 활동 스택 동작을 시뮬레이트하려는 적어도 몇 가지 상황을 겪었습니다. 이 경우 기본 onBackPressed () 동작을 재정의하는 것이 적절하다고 생각합니다. 그러나 일반적으로 동의합니다. 재정의를 피하십시오.
Matt Briançon

4
@Matt에 동의합니다. 현재 NDK를 사용하는 크로스 플랫폼 게임을 만들고 있습니다. 따라서 모든 것이 단일 활동이라면 가장 쉽습니다. 이 때문에 뒤로 단추의 기본 동작은 대부분의 사용자가 기대하지 않는 응용 프로그램을 이스케이프 처리하는 것입니다. 따라서 사용자가 실제로 다른 활동으로 이동 한 것처럼 특정 상황에서 앱을 종료하는 것처럼 활동이 다르게 동작하도록 기본 동작을 덮어 써야했습니다.
Leif Andersen

1
onSaveInstanceState와 데이터 저장이 완전히 다른 질문입니까?
Ted

@Ted-onSaveInstanceState에 대한 광고에서 UI가 아닌 앱 데이터를 유지하는 코드가 필요하다고 동의하면 동의합니다. 포 그라운드를 포기하자마자 더 이상 경고없이 앱이 종료 될 수 있습니다. 중요한 것은 항상 저장해야합니다. 반면에 앱 수명주기 메소드는 앱을 숨기고 유지하는 데 사용하는 기술에 관계없이 호출 될 것이라고 생각 하므로이 경우에만 저장 논리를 추가 할 필요는 없습니다. 앱은 올바른 위치에 상관없이 해당 코드가 필요합니다.
ToolmakerSteve

11

간단하게 ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

//super.onBackPressed (); 주석 달기 트릭을 할 것입니다


1
유용한 관찰이지만 뒤로 버튼이 깨진 것처럼 아무것도하지 않습니까? 사용자에게 혼란스럽고 성가신 것은 좋은 일이 아닙니다. IMHO는 요청에 따라 홈 버튼처럼 작동하도록 다른 답변의 논리를 추가해야합니다. 허용 된 답변 은 의도적으로 슈퍼 메소드를 호출하지 않았다고 언급 합니다.
ToolmakerSteve

예, 당신은 절대적으로 맞습니다. 뒤로 버튼을 무시하고 거기에 논리를 넣을 때까지 아무것도하지 않습니다. 버튼을 두 번 눌러 응용 프로그램을 닫거나 진행중인 작업 (진행 대화 상자) 등을 비활성화하고 조건을 완전히 충족시키는 조건 일 수 있습니다.
androCoder-BD 2016


3

뒤로 버튼 (휴대 전화 하단)과 홈 버튼 (작업 표시 줄 왼쪽에있는)의 동작을 처리하려는 경우 프로젝트에서 사용중인이 사용자 지정 활동이 도움이 될 수 있습니다. .

import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

활동에 사용 된 예 :

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}

1
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)

0

코 틀린에서 :

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
    // Handle the back button event
}

자세한 내용은 이것을 확인할 수 있습니다 .

Kotlin의 뒤로 버튼 재정의에 대한 특정 질문 이 있습니다 .

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