Android:进入“后台”时保存应用程序状态

时间:2011-01-22 00:47:56

标签: android android-activity persistence state

我有一个复杂的Android应用程序,具有相当大的应用程序状态,需要持久化(以特定格式)。写出数据不是一个瞬时操作,因此最好尽量减少不必要的持久性。

由于持久性开销,每次更改状态时保持状态是不切实际的。理想情况下,当用户点击“主页”按钮或点击应用程序根活动(或来电等)上的“后退”按钮来“应用”应用程序时,会触发持久状态。这样可以最大限度地减少持久性开销,同时从用户的角度保持状态一致性。问题是如何检测应用程序是否“背景化”?

活动生命周期调用(onStart,onResume,onPause和friends)没有帮助,因为应用程序有许多不同的活动,当用户点击“home”时,其中任何一个活动都可以处于活动状态。此外,当活动在Activity堆栈上被推送,弹出(和底部杀死)时调用调用,因此它们不会反映应用程序是否消失。

那么应用程序如何检测它何时进入后台?

5 个答案:

答案 0 :(得分:4)

如果你想在任何活动进入后台时保持某种状态,你可以随时扩展Activity,添加两个你在onPause和onResume中调用的抽象方法。然后,每个扩展此新抽象类的活动都将被强制定义saveState()和loadState()。这些方法可以定义为每个活动保存和加载的内容。

这只是使用继承来强制程序员实现其他被忽视的方法和技术方法的一个例子。您可以告诉程序员,如果您需要保存活动的状态,只需扩展此类活动,然后IDE就会将它们放在您的设计路径上。

package com.yourcompany.yourpackage;

import android.app.Activity;

public abstract class ActivitySaveState extends Activity{

    @Override
    protected void onPause() {
        super.onPause();
        saveState();
    }

    @Override
    protected void onResume() {
        super.onResume();
        loadState();
    }


    public abstract void loadState();
    public abstract void saveState();



}

你也可以在超类中为它们实例化一些状态保存机制(即web服务端点,DAO或w / e你的持久性单元。

@Override
    protected void onResume() {
        super.onResume();
        saveState();

        CustomDataAccessObject dao = new CustomDataAccessObject("Activity3");

        loadState(dao );
    }


    public abstract void loadState(CustomDataAccessObject dao);

答案 1 :(得分:2)

就我在Android中而言,没有应用程序作为整体进入后台的概念。您的应用程序是根据活动/服务联合/...一起工作的。并且您可以对其进行配置,以便它可以从不同的活动,不同的进程,不同的任务开始,因此(几乎?)无法确定应用程序何时进入后台。

除此之外,还有你的问题:

MyXxxActivity.onPause是您必须触发保存必须在应用程序的不同“运行”中保留的数据的最后安全机会。这不是 transient 应用程序状态,而是要转到DB / File System存储并且要在下次运行时再次检索的内容。

我认为您提到的申请状态属于此类别。

因此,必须从每个活动的onPause触发您的保存。如果在不同活动中共享任何状态(例如在应用程序中),则应从每个onPause 收集。或者也应该从每个onPause触发它的保存。

如果保存操作需要时间,则不应在主(UI)线程上运行它。相反,你应该把它交给另一个线程。同样,假设这是重要的状态,你希望被持久化,那么最好将这项工作交给服务(而不是像AsyncTask那样)。

答案 2 :(得分:0)

The Activity lifecycle calls (onStart, onResume, onPause and friends) don't help as the app has many different activities

您的活动应该足够独立,以至于您不需要知道整个应用程序何时在后台运行。听起来你有其他设计问题,如果没有更多细节,我们无法帮助你。

答案 3 :(得分:0)

我建议逐个活动地管理您的数据。这是在android docs中提出的。

对于任何改变持久状态的活动,请在离开活动时保存该状态。


来自http://developer.android.com/reference/android/app/Activity.html

onPause()是您处理离开活动的用户的地方。最重要的是,此时应该提交用户所做的任何更改(通常是提交数据的ContentProvider)。

答案 4 :(得分:-1)

这个帖子很老了,只是说当应用程序在后台或用户按下设备上的主页按钮时会触发onSaveInstanceState活动。那么,你可以保存状态,在onrestore上加载它等等......