티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
Android - How To Override the "Back" button so it doesn't Finish() my Activity?
안드로이드 - "뒤로" 버튼을 눌러도 Activity가 종료되지 않게 하는 방법
문제 내용
I currently have an Activity that when it gets displayed a Notification will also get displayed in the Notification bar.
현재 저는 Activity가 표시될 때 Notification 바에도 Notification이 표시되도록 구성하고 있습니다.
This is so that when the User presses home and the Activity gets pushed to the background they can get back to the Activity via the Notification.
이렇게 함으로써, 사용자가 홈 버튼을 누르고 Activity가 백그라운드로 밀려난 경우, 알림을 통해 다시 Activity로 돌아갈 수 있습니다.
The problem arises when a User presses the back button, my Activity gets destroyed but the Notification remains as I want the user to be able to press back but still be able to get to the Activity via the Notification. But when a USER tries this I get Null Pointers as its trying to start a new activity rather than bringing back the old one.
문제는 사용자가 뒤로 버튼을 누르면 내 활동이 파괴되지만, 알림은 남아 있어 사용자가 뒤로 버튼을 누르면 여전히 알림을 통해 활동으로 돌아갈 수 있도록 하기를 원하기 때문에 발생합니다. 하지만 사용자가 이렇게 시도할 때, 새로운 활동을 시작하는 대신 이전 활동을 되돌리려고 하기 때문에 Null Pointers가 발생합니다.
So essentially I want the Back button to act the exact same as the Home button and here is how I have tried so far:
그래서 기본적으로 백 버튼이 홈 버튼과 정확히 같은 방식으로 작동하도록 하려고 합니다. 지금까지 시도한 방법은 다음과 같습니다:
@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;
}
However the above code still seems to allow my Activity to be destroyed, How can I stop my Activity from being destroyed when the back button is pressed?
하지만 위의 코드는 여전히 내 Activity가 파괴되는 것을 허용하는 것 같습니다. 백 버튼이 눌릴 때 내 Activity가 파괴되는 것을 방지하는 방법은 무엇일까요?
높은 점수를 받은 Solution
Remove your key listener or return true
when you have KEY_BACK
.
키 리스너를 제거하거나 KEY_BACK을 처리할 때 true를 반환하세요.
You just need the following to catch the back key (Make sure not to call super in onBackPressed()
).
뒤로 가기 키를 잡기 위해서는 다음 코드만 필요합니다 (onBackPressed()에서 super를 호출하지 않도록 주의하세요).
Also, if you plan on having a service run in the background, make sure to look at startForeground()
and make sure to have an ongoing notification or else Android will kill your service if it needs to free memory.
또한, 백그라운드에서 실행되는 서비스를 사용할 계획이라면 startForeground()를 살펴보고, 계속된 알림이 있도록 하여 메모리를 확보해야 합니다. 그렇지 않으면 안드로이드는 메모리를 해제하기 위해 서비스를 종료시킬 수 있습니다.
@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);
}
가장 최근 달린 Solution
Just in case you want to handle the behaviour of the back button (at the bottom of the phone) and the home button (the one to the left of the action bar), this custom activity I'm using in my project may help you.
만약 당신이 백 버튼 (폰의 하단에 위치한 버튼)과 홈 버튼 (액션 바 왼쪽에 위치한 버튼)의 동작을 처리하길 원한다면, 나의 프로젝트에서 사용하는 이 커스텀 액티비티가 도움이 될지도 모릅니다.
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();
}
}
Example of use in your activity:
활용 예시:
public class SomeActivity extends BackActivity {
// ....
@Override
public void onBackPressed()
{
// Example of logic
if ( yourConditionToOverride ) {
// ... do your logic ...
} else {
super.onBackPressed();
}
}
}
출처 : https://stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity
'개발 > 안드로이드' 카테고리의 다른 글
LinearLayout에서 차일드 뷰들 사이에 프로그래밍 방식으로 패딩 주기 (0) | 2023.01.22 |
---|---|
APK 파일에서 AndroidManifest.xml을 보기 (0) | 2023.01.20 |
Android에서 화면 회전 방지하기 (0) | 2023.01.20 |
Parcelable encountered IOException 오류 해결하기 (0) | 2023.01.19 |
전화 걸기 앱에서 특정 전화번호가 표시되도록 하기 (0) | 2023.01.18 |