Android的 – 如何覆盖“后退”按钮,所以它不完成()我的活动?

我目前有一个活动,当它显示一个通知也会显示在通知栏。

这样当用户按下home并且Activity被推到后台时,他们可以通过Notification返回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; } 

然而,上面的代码似乎仍然允许我的活动被销毁,当按下后退按钮时,如何阻止我的活动被销毁?

删除你的关键侦听器,或者当你有KEY_BACK时返回true

你只需要以下来捕获后退键(确保不要在onBackPressed()调用super )。

此外,如果您计划在后台运行服务,请务必查看startForeground() ,并确保有持续的通知,否则如果需要释放内存,Android会startForeground()您的服务。

 @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 true; } return super.onKeyDown(keyCode, event); } @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); } 

我想你想要的不是重写后退按钮(这似乎不是一个好主意 – 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 } 

考虑上面的伪代码来指出你正确的方向。 阅读活动生命周期应该可以帮助您确定实现所需内容的最佳方式。

干脆这样做..

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

注释掉//super.onBackPressed(); 会做的伎俩

万一你想处理后退按钮(位于电话底部)和home按钮(操作栏左侧)的行为,我在项目中使用的这个自定义活动可能会帮助你。

 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() { finish(); } 
Interesting Posts