我目前有一个活动,当它得到显示的通知也将显示在通知栏。

这样,当用户按home键时,活动被推到后台,他们可以通过通知回到活动。

当用户按下后退按钮时,问题就出现了,我的活动被破坏了,但通知仍然存在,因为我希望用户能够按下后退,但仍然能够通过通知获得活动。但是当一个用户尝试这个我得到空指针,因为它试图开始一个新的活动,而不是带回旧的。

所以本质上,我希望后退按钮的作用与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;
        }   

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


当前回答

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

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

其他回答

我认为你想要的不是覆盖返回按钮(这似乎不是一个好主意- 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)从持久化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
}

考虑上面的伪代码,为您指明正确的方向。阅读活动生命周期可以帮助您确定完成您正在寻找的任务的最佳方法。

删除您的键侦听器或当您有KEY_BACK时返回true。

你只需要以下命令来捕获返回键(确保不要在onBackPressed()中调用super)。

另外,如果你计划让一个服务在后台运行,一定要查看start前台(),并确保有一个持续的通知,否则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() {
    super.onBackPressed();
}

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

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

在芬兰湾的科特林:

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

要了解更多信息,你可以查看这个。

在Kotlin中重写后退按钮也有具体的问题。