2010-07-23 29 views
2

官方文档描述如下任务:Android:如何检测当前的一系列活动(任务)是否移至背景?

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

有没有办法在当前活动的任务移入和移出背景的以编程方式检测?我想知道当用户切换到另一个应用程序时,与当用户导航到当前应用程序中的另一个活动时。

+0

如果您能告诉我们检测的目的是什么,这可能会有帮助吗? – EboMike 2010-07-23 03:40:13

+0

基于这两种情况,我的业务逻辑是不同的。后台活动在后台绑定到远程服务。如果用户实际上正在切换任务,我希望此背景活动解除绑定。否则,它需要保持绑定,以便将服务展示给我的应用中的其他活动。 – zer0stimulus 2010-07-23 13:23:32

回答

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开始活动时会调用onPause,其中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. 
    } 
} 
+0

查看James关于Back按钮的说法,这会在startActivity不是时会导致当前(前景)Activity的onPause方法被调用。所以也许重写后退按钮(我认为这是可能的)来适当地检测。但总体来看,这里需要更多的工作。 – Fraggle 2011-03-26 23:20:58

1

这是行不通的。除了您的应用明确开始其他活动之外,您的活动可能会因onPause而获得。例如,用户可能已经点击后退按钮,将您带回堆栈中的前一个活动。

+0

你没有回答这个问题,对吗? – 2012-12-13 16:19:09

0

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

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

当然,问题是有没有检测技术在这里,只是一种方式告诉什么正在运行,并且它的状态,但没有办法让知情的状态发生变化时。

所以可能只是运行一个后台线程来轮询这个信息。看起来有点可笑,但它可能工作。

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

0

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

@Override 
public void onPause() { 
    super.onPause(); 
    if(!isFinishing()) { 
     //app going to background 
    } 
} 
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

也许这可以是有益的,告诉我,如果它为你工作。 只有当您从后台返回时,活动的值将为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; 
} 

}


所有的类都必须从这个类扩展这个工作。

+0

静态变量可以在android下进行垃圾回收(没有你注意到),当你按下主页按钮时可以重置静态变量。这个实现是_guaranteed_在某些时候失败。 – meredrica 2013-06-12 11:20:04

+0

就像你说的主页按钮可以将它设置回0,这正是你想要在这种情况下,当你走出整个应用程序,这是0,通常垃圾收集器删除这个变量是更合理的,当你去到其他应用程序,然后当你返回这可能发生,但你又得到了你想要的确切结果(变量为0)。但是你是对的,它也可能发生,即使在你自己的应用程序内部垃圾收集器可以删除你的变量,但是我认为这不是那种可能的情况。 – 2013-06-12 11:59:56

+0

这是一种可能的情况。只需使用一些2.2内存较低的手机并推送新的活动。 – meredrica 2013-06-12 17:05:26

相关问题