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

时间:2010-06-29 15:05:08

标签: android android-activity nullpointerexception back-button onkeypress

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

这样当用户按下主页并将活动推送到后台时,他们可以通过通知返回活动。

当用户按下后退按钮时,问题就出现了,我的活动被破坏但是通知仍然存在,因为我希望用户能够按下但仍然可以通过通知进入活动。但是当用户尝试这个时,我会尝试Null Pointers尝试启动一项新活动,而不是将旧活动带回来。

基本上我希望Back按钮的行为与Home按钮完全相同,这是我到目前为止的尝试方式:


        @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被销毁?

9 个答案:

答案 0 :(得分:252)

删除密钥监听器,或在true时返回KEY_BACK

您只需要以下内容即可获取后退键(请确保不要在onBackPressed()中调用 super )。

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

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

答案 1 :(得分:65)

使用一行代码实现它更容易:

{{1}}

答案 2 :(得分:12)

我认为你想要的不是覆盖后退按钮(这似乎不是一个好主意 - Android操作系统定义了这种行为,为什么要更改它?),但要使用Activity Lifecycle并保持不变您在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应该可以帮助您确定实现所需目标的最佳方式。

答案 3 :(得分:10)

只需这样做..

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

评论//super.onBackPressed();会做的伎俩

答案 4 :(得分:2)

如果您想要处理后退按钮(位于手机底部)和主页按钮(操作栏左侧的那个)的行为,我将使用此自定义活动我的项目可以帮到你。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

在科特林:

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

有关更多信息,您可以检查this

关于Kotlin中的覆盖后退按钮,还有一个特定的question

答案 7 :(得分:0)

看起来很晚了,但是对于那些需要切换到新屏幕并清除后退按钮堆栈的人来说,这是一个非常简单的解决方案。

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

finishAffinity();方法清除后退按钮堆栈。

答案 8 :(得分:-2)

做到这一点

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