2011-07-22 42 views
15

当按下BACK键时,现在活动被破坏。我怎样才能使它停止(即保持所有变量等),而不是被破坏?如何使活动从BACK键停止,而不是被销毁?

谢谢!

+0

的http:// stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity –

+0

类似,但它在后退键按下时运行主要活动。我只需要停下来(即暂停并移动到背景,从而返回到之前的活动)。 – Roger

+0

什么/多少变数?他们如何被使用?您可以考虑将它们设置为类变量,而不用担心使活动保持活动状态。 – Rob

回答

13

为什么你需要保持变量存活?考虑到Android应用程序的建立生命周期,我不确定阻止活动被破坏“仅仅为了保持变量”是合理的。

  1. 即使您在不破坏应用程序的情况下停止应用程序,Android始终有可能杀死它以释放内存。无论如何,您必须在代码中对此进行解释,因此防止应用程序被破坏并不会使您无法编写代码。

  2. 使用onPause()和onResume()方法中的SharedPreferences,可以相对容易和快速地保存和恢复变量。除非您存储大量数据,否则防止应用程序被破坏可能没有多大区别。

  3. 这听起来像你想保留变量在内存中,因为你打算返回到这个活动。通常情况下,您不会使用后退按钮来远离您想要返回的活动。相反,您会创建一个意图并开始一个新的活动。当你这样做时,Android将当前活动放在Back Stack上,调用onPause()和onStop(),这看起来就像你正在寻找的行为。

所以,如果你还真想防止被破坏(至少要等到Android的决定是使用过多内存,并杀死它在它自己),你总是可以使用萨格尔的代码,并在启动一个新的活动你的活动onBackPressed()。

@Override 
public void onBackPressed() 
{ 
    Intent intent = new Intent(this, Other.class); 
    startActivity(intent);  
} 

只要确定那是你真正想要做的。

+0

谢谢,作品...只是一个细节,我应该如何让它知道哪个活动开始了这个活动,以便它知道要返回哪个活动? – Roger

+1

如果您只想返回到上一个活动,那么为什么后退按钮的正常功能不可接受?您可以通过在用于使用intent.putExtra(“activity_name”,“activity_1”)开始第二个活动的Intent中包含有关它的信息,然后在第二个活动中检索该名称来确定第一个活动。但是,除非你在做一些非常不寻常的事情,否则你的兴趣可以通过在onPause()和onResume()中正确保存你的数据,而不必重写onBackPressed()来获得。 – theisenp

+0

+1进行详细深入的回应! –

1

这与之前询问的this question类似。

希望这会有所帮助! N.S.

+2

关闭,但“moveTaskToBack(true);”停止整个应用程序(即充当“家”按钮),而我只需要停止一个活动。 – Roger

5

按BACK键触发Activity类的onBackPressed回调方法。此回调的默认实现调用finish()方法。

http://developer.android.com/reference/android/app/Activity.html#onBackPressed()

您可以覆盖此方法来移动活动背景(模拟天生按HOME键的作用

如:


@Override 
public void onBackPressed() { 
    onKeyDown(KeyEvent.KEYCODE_HOME);   
} 

你也可以改为考虑moveTaskToBackground()提到这里:

Override back button to act like home button

+0

不,不,只需要停止一个活动,而不是整个应用程序。 :) – Roger

+0

我相信如果你停止一个活动,你会失去它的上下文和所有它的本地变量。这捍卫你想要达到的目标。纠正我,如果我错了。 –

+0

不是真的,如果我覆盖后退按钮以像home按钮一样操作,则当我再次启动应用程序时,内容仍然存在。问题是它停止了整个应用程序,而我只需要停止一个活动。 :) – Roger

0

首先,抱歉没有回答问题,原因,我仍然没有最佳答案。 但是,当人们开始问“你需要什么”时,我真的很喜欢。而且,很少有人问这个问题,确实值得这样的问题。我觉得没有这个时间,但没关系,这不是问题......

无论如何,我会尝试指出为什么我们有些人深信,

从活动A到活动B(创建UI基于一些数据提取)和从B返回到A(销毁所有创建的UI和/或B中获取的数据)有时是一个坏概念。更好的解决方案是将堆栈保持原样,因此在Activity B中使用finish(),但将Activity B保持为Pause状态,以便稍后再次从Activity A调用它时 - 它只会在onResume =没有重新创建在UI中,不需要额外的数据提取。当然,奖金是一个快速响应的用户界面,如果你有更复杂的用户界面布局,这种差异是真的。

10

简单的一行

@Override 
public void onBackPressed() { 
    mActivity.moveTaskToBack(true); 
} 
+0

真棒。刚刚解决了我的问题,一行 – Jigar

+0

最好的答案,解决了一行中的问题。 –

1

我设法找出你想要什么: 2个活动之间切换使用后退按钮并保持所有不被摧毁!

例如:你有2个活动& B. A将首先启动,然后在装入B调用B.,用户按下返回键和切换回从B.活动距离现在B应该在不会被破坏,只是进入背景,当用户再次从A开始活动B时,活动B将被带到前台,而不是被重新创建或创建新的实例!

如何实现这一点:

1.覆盖onBackPressed()活动B的:

@Override 
public void onBackPressed() { 
    Intent backIntent = new Intent(this, ActivityA.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(backIntent); 
} 

2.在活动A,呼叫活动B:

public void callActivityB() { 
    Intent toBintent = new Intent(this, ActivityB.class); 
    toBIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(toBintent); 
} 

记得要加标志:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT当您致电A & B.

-2

只需在活动清单中指定为

android:persistent="true" 

这应该可以防止你的活动被破坏。为了更多地了解这个请参考这是由我回答了这些链接如下

How to prevent call of onDestroy() after onPause()?

Prevent activity from being destroyed as long as possible

在上面的帖子我已经详细的使用情况说明

+1

该属性不存在以下活动:https://developer.android.com/guide/topics/manifest/activity-element.html – jekatt

+0

@jekatt它确实存在https://developer.android.com/guide/topics/ manifest/application-element.html –

+0

@ aravind.udayashankara此属性用于'',如您在参考的文档中所述。 也在这个文档中 https://developer.android.com/guide/topics/manifest/activity-element.html 关于'''android:persistent'属性不存在 –

相关问题