如何知道某个ACTIVITY是否在前台?

本文链接:http://zengrong.net/post/1680.htm


有一个Android应用包含包含一个后台程序,该程序会定期连接服务器来实现自定义信息的推送。但是,当这个应用处于前台的时候,后台程序就没有必要连接服务器了。这样可以节省网络资源,也更省电。

用什么方法知道该应用是否处于前台呢?

网上搜到的方法大多数都是使用下面的代码:

1

2

3

4

5

6

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);

//获得task列表

List<ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

Log.d("topActivity", "CURRENT Activity ::"+ taskInfo.get(0).topActivity.getClassName());

ComponentName componentInfo = taskInfo.get(0).topActivity;

componentInfo.getPackageName();

但是查阅Android文档后发现,google并不推荐使用这个方法:

This should never be used for core logic in an application, such as deciding between different behaviors based on the information found here. Such uses are not supported, and will likely break in the future. For example, if multiple applications can be actively running at the same time, assumptions made about the meaning of the data here for purposes of control flow will be incorrect.

而且,这个方法还要求设置android.permission.GET_TASKS权限。

因此,我必须寻找更加合适的方法来做这件事。最终,我找到这个方法getRunningAppProcesses(),它并不需要增加特殊的权限。

下面是范例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/**

* 返回当前的应用是否处于前台显示状态

* @param $packageName

* @return

*/

private boolean isTopActivity(String $packageName)

{

//_context是一个保存的上下文

ActivityManager __am = (ActivityManager) _context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);

List<ActivityManager.RunningAppProcessInfo> __list = __am.getRunningAppProcesses();

if(__list.size() == 0) return false;

for(ActivityManager.RunningAppProcessInfo __process:__list)

{

Log.d(getTAG(),Integer.toString(__process.importance));

Log.d(getTAG(),__process.processName);

if(__process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&

__process.processName.equals($packageName))

{

return true;

}

}

return false;

}

时间: 2024-08-29 20:05:21

如何知道某个ACTIVITY是否在前台?的相关文章

Bringing the activity to foreground 将activity切换到前台

今天遇到这个问题,找了很久,网上一些解决方法不够完全.特做此记录: 经测试以下方法不能将在后台运行的activity切换到前台运行! 1 Intent i = new Intent(); 2 i.setClass(this, MainActivity.class); 3 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 4 startActivity(i); 必须要将i替换为getApplicationContext()才可以将MainActivity运行,但

如何判断Activity是否在前台显示

转载请备注原文地址: https://www.niwoxuexi.com/blog/android00/article/223.html 我们在Android开发过程中,经常会判断Activity是否在前台显示,来处理某些状态,这里谢了一个静态方法,供大家参考. 方法一:用ActivityManager管理的Activity栈来操作 public class  CommonUtil{     /**      * 判断某个Activity 界面是否在前台      * @param contex

第一章:Activity的生命周期和启动模式

Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 说明 (1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop (3)返回原Activity时,回调如下:onRestart->on

Android Activity基础详解

一.Activity简介 Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件或查看地图等操作. 每个 Activity 都会获得一个用于绘制其用户界面的窗口.窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上. 一个应用通常由多个彼此松散联系的 Activity 组成. 一般会指定应用中的某个 Activity 为"主" Activity,即首次启动应用时呈现给用户的那个 Activity. 而且每个 Activity 均可启动另

activity劫持反劫持

1.Activity调度机制 android为了提高用户的用户体验,对于不同的应用程序之间的切换,基本上是无缝.他们切换的只是一个activity,让切换的到前台显示,另一个应用则被覆盖到后台,不可见.Activity的概念相当于一个与用户交互的界面.而Activity的调度是交由Android系统中的AmS管理的.AmS即ActivityManagerService(Activity管理服务),各个应用想启动或停止一个进程,都是先报告给AmS. 当AmS收到要启动或停止Activity的消息时

android之Activity回传数据

约定:当Activity发生跳转时将原来的Activity成为父Activity,将新出现的Activity成为子Activity. 情景设置 下面是个发短信的Activity 当我们点击图中的+按钮后会跳转到联系人界面 在联系人界面选择某个联系人后,比如联系人ccc,联系人界面消失并回到发短信界面. 这其中设计到了Activity的跳转以及数据回传 过程分析 当在父Activity中进行了某些操作后,产生了子Activity.然后我们在子Activity又进行了一些操作,同时希望父Activi

Android群英传笔记——第八章:Activity与Activity调用栈分析

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他

检查app的activity是否在当前

APP开发中经常会遇到这种需求,需要检查当前的APP是不是可见的,比如,如果是可见的就维持一个socket长连接,如果切到后台不可见了,就断开这个连接.Android本来并不允许APP去监听home键事件,所以我们没发像iOS那样通过监听home键事件来做对应的处理.不过还好Android的Activity的生命周期给我们提供了一种解决这个问题的方法,我们只需要在每个Activity的onStart和onStop中去维持一个计数,如果这个数值大于0,就表示我们的APP还有Activity是在前台

保存Activity的状态

一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留. 但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveIn