为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2019-07-03 15:50:57
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;         }然而,上面的代码似乎仍然允许我的活动被销毁,当按下“后退”按钮时,我如何才能阻止我的活动被销毁呢?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

移除关键侦听器或返回true当你有KEY_BACK.

您只需要下面的命令就可以捕获回键(请确保不要调用超级在……里面onBackPressed()).

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

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


查看完整回答
反对 回复 2019-07-03
?
慕斯王

TA贡献1864条经验 获得超2个赞

仅用一行代码实现它就更容易了:

@Overridepublic void onBackPressed() {
   moveTaskToBack(true);}


查看完整回答
反对 回复 2019-07-03
?
潇湘沐

TA贡献1816条经验 获得超6个赞

我认为您想要的不是覆盖后退按钮(这似乎不是一个好主意-Android操作系统定义了这种行为,为什么要改变它?),而是使用活动生命周期并将您的设置/数据持久化到onSaveInstanceState(Bundle)事件。

@OverrideonSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle}

然后你用onCreate(束)要从持久化的包中获取一切,并重新创建您的状态。

@OverrideonCreate(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}

考虑以上的psuedo代码,以指出您的正确方向。读到活动生命周期应该能帮助你确定完成你想要的东西的最佳方法。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 399 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信