Android:如何检测当前堆栈的活动(任务)是否移至后台?

时间:2010-07-23 01:52:50

标签: android

官方文档描述了如下任务:

  

*任务中的所有活动都作为一个整体一起移动。整个任务(整个活动堆栈)可以被带到前台或发送到后台。例如,假设当前任务在其堆栈中有四个活动 - 在当前活动下有三个活动。用户按下HOME键,转到应用程序启动器,然后选择一个新应用程序(实际上是一个新任务)。当前任务进入后台,并显示新任务的根活动。然后,在短时间之后,用户返回主屏幕并再次选择先前的应用程序(前一个任务)。这个任务,包括堆栈中的所有四个活动,出现了。

有没有办法以编程方式检测当前Activity的任务何时进出后台?我想知道用户何时切换到另一个应用程序,而当用户导航到当前应用程序中的另一个Activity时。

8 个答案:

答案 0 :(得分:4)

请注意:我一直有这样的设计在我的头上,但从来没有得到周围的混凝土测试(有理由相信它的工作原理虽然),所以如果你最终想这个,告诉我是怎么回事。 :)


我认为没有一种官方的API方法会给你这个功能(我可能错了),但你当然可以自己构建。这只是我这样做的方式;当然,可能会有更好的实施方式。

在您的应用程序中,您始终知道何时开始其他活动。话虽如此,您可以创建一个全局类来处理启动所有应用程序活动并跟踪表示您何时开始活动的布尔值:

public class GlobalActivityManager {

    private static boolean isActivityStarting = true;

    public static boolean isActivityStarting() {
        return isActivityStarting;
    }

    public static void setIsActivityStarting(boolean newValue) {
        isActivityStarting = newValue;
    }

    public static void startActivity(Activity previous, Class activityClass) {
        isActivityStarting = true;
        // Do stuff to start your activity
        isActivityStarting = false;
    }
}

然后在每个活动的(也许使这个超类),覆盖onPause()方法来检查,如果它是你的应用程序的活动的另一个开始或外国任务的应用程序在应用程序的前方传来。这工作,因为在onPause在执行时发生了任何事情在活动前,这意味着当你开始在你的活动,它被称为GlobalActivityManager其中isActivityStarting是真实的。

public void onPause() {
    super.onPause();
    if (GlobalActivityManager.isActivityStarting()) {
        // It's one of your application's activities. Everything's normal.
    } else {
        // Some other task has come to the foreground. Do what needs to be done.
    }
}

答案 1 :(得分:3)

    public boolean isCurrentTaskInBackground() {
    List<RunningTaskInfo> taskInfoList = mActivityManager.getRunningTasks(1);
    if (taskInfoList != null && taskInfoList.size() > 0) {
        RunningTaskInfo info = taskInfoList.get(0);

        ComponentName componentName = info.baseActivity;

        MobileTvLog.debug("App#isCurrentTaskInBackground -> baseActivity = " + componentName);

        String packageName = componentName.getPackageName();

        return !YOUR_PKG_NAME.equals(packageName);
    } else {
        return true;
    }
}

答案 2 :(得分:2)

也许这可能会有所帮助,告诉我它是否适合你。 只有当你从后台返回时,活动的值才为0(零) 当onRestart()时,其余时间将是一个高于0(零)的数字 被执行。

public class FatherClass extends Activity {

private static int activities = 0;

public void onCreate(Bundle savedInstanceState, String clase) {
    super.onCreate(savedInstanceState);
}

protected void onRestart()
{
    super.onRestart();
    if(activities == 0){
        Log.i("APP","BACK FROM BACKGROUND");
    }
}

protected void onStop(){
    super.onStop();
    activities -= 1;
}

protected void onStart(){
    super.onStart();
    activities += 1;
}

}


您的所有课程都必须从此课程扩展才能实现。

答案 3 :(得分:1)

那不行。您的活动可能会因为您的应用明确启动其他活动以外的其他原因而获得onPause。例如,用户可以点击后退按钮,将您带回到堆栈中的上一个活动。

答案 4 :(得分:1)

尝试阅读有关android:finishOnTaskLaunch

的内容

http://developer.android.com/guide/topics/manifest/activity-element.html#finish

它解决了我类似的问题; - )

答案 5 :(得分:0)

我一直在寻找这个问题的好答案。看起来Andy Zhang有一个好主意,但可能需要更多的工作来处理其他事情,比如Back按钮。

另一种看起来很有希望的方法是使用ActivityManager.getRunningAppProcesses()方法,它会给你一个RunningAppProcessInfo列表,每个都有一个“重要性”变量,可以用来检测你的进程是在前台还是其他的状态。

问题当然是这里没有检测技术,只是一种告诉运行状态及其状态的方法,但在状态发生变化时无法获得通知。

因此可能只需运行后台线程来轮询此信息。看起来有点kludgy但它可能会奏效。

我的应用程序使用位置服务(GPS),因此当位置发生变化时会自动调用它,并且当发生这种情况时我可以检查RunningAppProcessInfo列表以确定我的应用程序是否仍在前台。看起来好像很多工作,所以也许安迪的方法可以改进。

答案 6 :(得分:0)

我一直在使用我在这里描述的方法:

Simple check for Android application backgrounding

它对我来说非常有效。

答案 7 :(得分:0)

您可以在onPause()中使用isFinishing()方法。这将告诉您应用程序是否正在完成或暂停。当您的任务堆栈进入后台时,活动尚未完成,它们只是暂停。如果你从这个开始另一个活动,也会调用它,所以你必须检查它。

@Override
public void onPause() {
    super.onPause();
    if(!isFinishing()) {
        //app going to background
    }
}