programing

Android - "뒤로" 버튼을 무시하여 활동이 종료되지 않도록 하는 방법은 무엇입니까?

oldcodes 2023. 9. 1. 21:20
반응형

Android - "뒤로" 버튼을 무시하여 활동이 종료되지 않도록 하는 방법은 무엇입니까?

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

이것은 사용자가 홈을 누르고 활동을 백그라운드로 밀면 알림을 통해 활동으로 돌아갈 수 있도록 하기 위한 것입니다.

문제는 사용자가 뒤로 단추를 누르면 내 활동이 삭제되지만 사용자가 뒤로 누를 수 있지만 알림을 통해 활동에 액세스할 수 있기를 원하는 경우 알림은 그대로 유지됩니다.그러나 사용자가 이 작업을 시도하면 이전 작업을 되돌리는 대신 새 작업을 시작하려고 시도하는 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;
        }   

그러나 위의 코드는 여전히 활동을 삭제할 수 있는 것 같습니다. 뒤로 버튼을 눌렀을 때 활동이 삭제되지 않도록 하려면 어떻게 해야 합니까?

키 수신기 제거 또는 반환true있을 때KEY_BACK.

백 키를 잡으려면 다음이 필요합니다(슈퍼인을 부르지 않도록 하십시오).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);
}

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

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

간단히 이것을 하라.

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

//super.onBackPressed()를 주석 처리합니다.

제 생각에 당신이 원하는 것은 뒤로 단추를 덮어쓰는 것이 아니라(Android 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
}

위의 psuedo-code를 고려하여 올바른 방향을 가리킵니다.활동 라이프사이클을 자세히 읽어보면 원하는 것을 달성할 수 있는 최선의 방법을 결정하는 데 도움이 될 것입니다.

사용해 보십시오.

@Override
public void onBackPressed() {
    finish();
}

뒤로 단추(전화기 하단)와 홈 단추(액션 모음 왼쪽)의 동작을 처리하려는 경우에 대비하여 제가 프로젝트에서 사용하는 이 사용자 지정 활동이 도움이 될 수 있습니다.

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

코틀린에서:

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

자세한 내용은 이 항목을 참조하십시오.

코틀린의 뒤로 단추를 덮어쓰는 것에 대한 구체적인 질문도 있습니다.

매우 늦은 감이 있지만 새 화면으로 전환하고 뒤로 버튼 스택을 지워야 하는 분들에게는 매우 간단한 해결책입니다.

startActivity(new Intent(this,your-new-screen.class));
finishAffinity();

finishAffinity(); 메서드는 뒤로 버튼 스택을 지웁니다.

그냥 이렇게 해요.

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

언급URL : https://stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity

반응형