Android-如何覆盖“Back”按钮,这样它就不会完成我的活动?

Android-如何覆盖“Back”按钮,这样它就不会完成我的活动?

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

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

当用户按下“后退”按钮,我的活动就会被销毁,但通知仍然是我希望用户能够按下,但仍然能够通过通知到达活动时出现的问题。但是当用户尝试这一点时,我会得到Null指针,因为它试图启动一个新的活动,而不是带回旧的活动。

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

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


慕丝7291255
浏览 400回答 3
3回答

侃侃尔雅

移除关键侦听器或返回true当你有KEY_BACK.您只需要下面的命令就可以捕获回键(请确保不要调用超级在……里面onBackPressed()).此外,如果计划在后台运行服务,请确保查看startForeground()并确保有一个持续的通知,否则Android将关闭您的服务,如果它需要释放内存。@Overridepublic&nbsp;boolean&nbsp;onKeyDown(int&nbsp;keyCode,&nbsp;KeyEvent&nbsp;event)&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Integer.parseInt(android.os.Build.VERSION.SDK)&nbsp;>&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;keyCode&nbsp;==&nbsp;KeyEvent.KEYCODE_BACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;event.getRepeatCount()&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("CDA",&nbsp;"onKeyDown&nbsp;Called"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onBackPressed(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.onKeyDown(keyCode,&nbsp;event);}@Overridepublic&nbsp;void&nbsp;onBackPressed()&nbsp;{ &nbsp;&nbsp;&nbsp;Log.d("CDA",&nbsp;"onBackPressed&nbsp;Called"); &nbsp;&nbsp;&nbsp;Intent&nbsp;setIntent&nbsp;=&nbsp;new&nbsp;Intent(Intent.ACTION_MAIN); &nbsp;&nbsp;&nbsp;setIntent.addCategory(Intent.CATEGORY_HOME); &nbsp;&nbsp;&nbsp;setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); &nbsp;&nbsp;&nbsp;startActivity(setIntent);}

慕斯王

仅用一行代码实现它就更容易了:@Overridepublic&nbsp;void&nbsp;onBackPressed()&nbsp;{ &nbsp;&nbsp;&nbsp;moveTaskToBack(true);}

潇湘沐

我认为您想要的不是覆盖后退按钮(这似乎不是一个好主意-Android操作系统定义了这种行为,为什么要改变它?),而是使用活动生命周期并将您的设置/数据持久化到onSaveInstanceState(Bundle)事件。@OverrideonSaveInstanceState(Bundle&nbsp;frozenState)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;frozenState.putSerializable("object_key", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;someSerializableClassYouWantToPersist); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;etc.&nbsp;until&nbsp;you&nbsp;have&nbsp;everything&nbsp;important&nbsp;stored&nbsp;in&nbsp;the&nbsp;bundle}然后你用onCreate(束)要从持久化的包中获取一切,并重新创建您的状态。@OverrideonCreate(Bundle&nbsp;savedInstanceState)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if(savedInstanceState!=null){&nbsp;//It&nbsp;could&nbsp;be&nbsp;null&nbsp;if&nbsp;starting&nbsp;the&nbsp;app. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mCustomObject&nbsp;=&nbsp;savedInstanceState.getSerializable("object_key"); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;etc.&nbsp;until&nbsp;you&nbsp;have&nbsp;reloaded&nbsp;everything&nbsp;you&nbsp;stored}考虑以上的psuedo代码,以指出您的正确方向。读到活动生命周期应该能帮助你确定完成你想要的东西的最佳方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android