提问人:Donal Rafferty 提问时间:6/29/2010 最后编辑:Donal Rafferty 更新时间:10/30/2020 访问量:409889
Android - 如何覆盖“返回”按钮,使其不会完成()我的活动?
Android - How To Override the "Back" button so it doesn't Finish() my Activity?
问:
我目前有一个活动,当它显示时,通知也会显示在通知栏中。
这样,当用户按 Home 键并且 Activity 被推送到后台时,他们可以通过通知返回 Activity。
当用户按下后退按钮时,会出现问题,我的活动被销毁,但通知仍然存在,因为我希望用户能够按下后退,但仍然能够通过通知访问活动。但是当用户尝试这样做时,我会得到空指针,因为它试图启动一个新活动而不是带回旧活动。
因此,从本质上讲,我希望“后退”按钮的行为与“主页”按钮完全相同,这是我到目前为止尝试过的方法:
@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;
}
但是,上面的代码似乎仍然允许我的 Activity 被销毁,当按下后退按钮时,如何阻止我的 Activity 被销毁?
答:
我认为您想要的不是覆盖后退按钮(这似乎不是一个好主意 - Android 操作系统定义了该行为,为什么要更改它?),而是使用活动生命周期并将您的设置/数据保存在 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
}
考虑上面的伪装代码,为你指明正确的方向。阅读活动生命周期应该可以帮助您确定完成所需任务的最佳方式。
评论
删除密钥侦听器,或在有 .true
KEY_BACK
您只需要以下命令即可获取后退键(确保不要调用 super in)。onBackPressed()
此外,如果您计划在后台运行服务,请务必查看并确保有持续的通知,否则 Android 会在需要释放内存时终止您的服务。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);
}
仅使用一行代码即可更轻松地实现它:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
评论
只需这样做..
@Override
public void onBackPressed() {
//super.onBackPressed();
}
注释掉 //super.onBackPressed();会做诀窍
评论
试试这个:
@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)
在 Kotlin 中:
val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
// Handle the back button event
}
有关更多信息,您可以查看此内容。
还有一个关于在 Kotlin 中覆盖后退按钮的具体问题。
看起来我很晚了,但对于那些需要切换到新屏幕并清除后退按钮堆栈的人来说,这是一个非常简单的解决方案。
startActivity(new Intent(this,your-new-screen.class));
finishAffinity();
finishAffinity();方法清除后退按钮堆栈。
就这样做
@Override
public void onBackPressed() {
super.onBackPressed();
}
评论
, the
>
OnBackInvokedCallback
androidx.activity.OnBackPressedCallback