如何判断我的应用程序是否从后台恢复?

时间:2011-10-31 10:44:58

标签: android

我希望在后台运行时锁定我的应用程序 当它恢复时我想显示我自己的锁屏。锁定屏幕是我的应用程序的活动。

成功登记密码后,用户可以看到恢复的活动 否则他不能。

我该怎么做?

5 个答案:

答案 0 :(得分:12)

主要问题是,当您从后台启动Activity时,必须获得特定行为。每次在onPause()之间切换时,onResume()Activities都会被调用,而不仅仅是在您最小化应用程序时。要解决这个问题,您可以从ActivityManager获取当前正在运行的任务,并将其包名称与您的应用程序进行比较:

private boolean isApplicationInBackground() {
    final ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningTaskInfo> tasks = manager.getRunningTasks(1);
    if (!tasks.isEmpty()) {
        final ComponentName topActivity = tasks.get(0).topActivity;
        return !topActivity.getPackageName().equals(getPackageName());
    }    
    return false;
}

现在你可以这样做:

public boolean wasPaused = false;

@Override
public void onPause() {
    super.onPause();

    if(isApplicationInBackground()) {
        wasPaused = true;
    }
}

@Override
public void onResume() {
    super.onResume();

    if(wasPaused) {
        lockScreen();
        wasPaused = false;
    }
}

就是这样!我建议您在基础Activity中实施此功能,其中所有其他Activities来自。

答案 1 :(得分:9)

如果您拥有全局活动“MyActivity”并且所有活动都从中扩展,您就可以实现这一目标。

然后在“MyActivity”上覆盖onPause和onStop方法

@Override
public void onPause()
{
    super.onPause();
    setLockStatus(false);
}

@Override
public void onStop()
{
    super.onStop();
    setLockStatus(true);
}

@Override
public void onResume()
{
    super.onResume();
    checkLockScreen();
}

编辑:显然你需要创建方法setLockStatus和checkLockScreen并做任何你想做的事情(比如在sharedPreferences上保存状态)。

答案 2 :(得分:3)

对于任何有兴趣的人,如果我理解你的问题,我会调查类似的功能,并对我发现的内容不满意。我想确定活动何时从后台恢复,而不是从被叫活动恢复活动。

我最终使用了一个boolean标志,该标志从startActivity设置,允许调用Activity确定它是从被调用的Activity还是从后台恢复。像这样的东西

private static boolean RESUME_FROM_ACTIVITY;

@Override
public void onResume(){
    super.onResume();
    if(!RESUME_FROM_ACTIVITY){
        // do what you want like lock the screen
    }
    RESUME_FROM_ACTIVITY = false;
}

@Override
public void startActivity(Intent intent){
    RESUME_FROM_ACTIVITY = true;
    super.startActivity(intent);
}

由于Android处理静态和活动堆栈(read more in this blog post)的方式,这应该在概念上有效。更多的解释是,静态应该是应用程序运行时从内存中清除的最后一件事如果堆空间太大。如果没有堆栈本身被销毁,活动将不会被销毁,因此onResume将被调用,它将检查静态标志以查看它是来自另一个活动还是来自后台。

静态甚至可能是过度杀伤,因为活动本身也不会被破坏,并且它的全局变量将尽可能长。这只是概念性的,我们仍处于压力测试的中间,但它是一种选择。如果我们发现任何问题,我会更新这篇文章。

答案 3 :(得分:2)

您的活动在其生命周期中有onResume()个回调。简单地覆盖它并执行您需要做的事情。

答案 4 :(得分:1)

你应该覆盖onResume和onPause

的方法

参见 this ,您将获得:)

在你的活动中你可以有一个标志 布尔锁定;

并且在onPause中您可以将其设置为true。 每次在关键位置,你都可以检查这个标志的状态,如果是真的,那么你会在解锁成功后向你显示解锁活动,然后将标志设置为假。