我正在我的安卓应用程序中执行由c2dm触发的状态栏通知。如果应用程序正在运行,我不想显示通知。如何确定应用程序是否正在运行以及是否处于前台?
发布于 2011-04-01 02:43:53
创建一个全局变量,如private boolean mIsInForegroundMode;,并在onPause()中分配一个false值,在onResume()中分配一个true值。
示例代码:
private boolean mIsInForegroundMode;
@Override
protected void onPause() {
super.onPause();
mIsInForegroundMode = false;
}
@Override
protected void onResume() {
super.onResume();
mIsInForegroundMode = true;
}
// Some function.
public boolean isInForeground() {
return mIsInForegroundMode;
}发布于 2012-06-14 18:03:44
或者,您可以通过getRunningTasks方法使用ActivityManager检查哪些任务正在运行。然后检查返回的任务列表中的第一个任务(前台的任务),如果它是您的任务。
以下是代码示例:
public Notification buildNotification(String arg0, Map<String, String> arg1) {
ActivityManager activityManager = (ActivityManager) appContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager
.getRunningTasks(Integer.MAX_VALUE);
boolean isActivityFound = false;
if (services.get(0).topActivity.getPackageName().toString()
.equalsIgnoreCase(appContext.getPackageName().toString())) {
isActivityFound = true;
}
if (isActivityFound) {
return null;
} else {
// write your code to build a notification.
// return the notification you built here
}
}并且不要忘记在manifest.xml文件中添加GET_TASKS权限,以便能够在上面的代码中运行getRunningTasks()方法:
<uses-permission android:name="android.permission.GET_TASKS" />p/s :如果同意这样做,请注意此权限现在已被弃用。
发布于 2014-10-31 04:27:42
这是一个相当古老的帖子,但仍然非常相关。上述被接受的解决方案可能有效,但是错误的。As Dianne Hackborn wrote:
这些API不是应用程序的UI流的基础,而是做一些事情,比如向用户显示正在运行的应用程序,或者任务管理器,等等。
是的,在内存中有一个关于这些东西的列表。然而,它是在另一个进程中关闭的,由独立于您的进程运行的线程管理,并且您不能指望(a)及时看到做出正确的决定或(b)在您返回时有一个一致的画面。另外,关于“下一个”活动的决定总是在发生切换的时候完成,直到那个确切的点(活动状态被短暂锁定以进行切换),我们才真正知道下一件事将是什么。
这里的实现和全局行为不能保证在未来保持不变。
正确的解决方案是实现:ActivityLifeCycleCallbacks。
这基本上需要一个应用程序类,可以在其中设置处理程序来识别应用程序中活动的状态。
https://stackoverflow.com/questions/5504632
复制相似问题