转自:http://notes.stay4it.com/2016/02/26/check-if-app-is-running-forground/

在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等。

从网上找到的方法大部分都是通过判断runningAppProcess里面是否有该app的进程这样来判断app是否还在运行,但是这种方法有种windows资源管理器的既视感。

经过查找发现,Android在SDK 14的时候提供了一个Callback。ActivityLifecycleCallbacks,你可以通过这个Callback拿到App所有Activity的生命周期回调。看图:

这个Callback写在Application里的,你可以在Application初始化的时候来注册。我们可以写个单例类来cache这些status。这里我叫它AppStatusTracker。在Application的onCreate()里让AppStatusTracker注册ActivityLifecycleCallbacks。

从WelcomeActivity跳转到GestureActivity。回调方法如下:
A.onPause() -> B.onStart() -> B.onResume() -> A.onStop()

通过这些回调我们可以在onStart()和onStop()中进行计数,如果start就+1,onstop就-1,这样可以根据计数是否为0来判断是否是前台了。

现在再说,什么情况下来显示手势解锁界面。
我的需求是当用户锁屏后再解锁或者切换到后台10分钟后显示手势解锁界面。
我们拆分下需求,先说锁屏,解锁。

这个是有BroadCastReciever来接收的,注册下就可以了,每次收到锁屏ACTION_SCREEN_OFF的action时,将AppStatusTracker里的isScreenOff设置为true。
当收到解锁ACTION_SCREEN_ON再将isScreenOff设为false。

再说切换到后台10分钟后显示手势解锁。这个只需要在onActivityStop()时更新下lastBackgroudTimestamp就可以了。

下面是完整的代码:

public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {
/** 切换到后台的时间戳*/
public long screenOnTime = 0l;
/** 当前是否有activity在运行 */
public int count = 0;
/** 屏幕点亮*/
public boolean screenOn = true;
/** 是否是在后台*/
public boolean isBackGround = false;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
LogUtil.e("onActivityCreated");
} @Override
public void onActivityStarted(Activity activity) {
LogUtil.e("onActivityStarted");
LogUtil.e(activity.getClass().getName());
count++;
} @Override
public void onActivityResumed(Activity activity) {
LogUtil.e("onActivityResumed");
isBackGround = false;
screenOnTime = 0l; } @Override
public void onActivityPaused(Activity activity) {
LogUtil.e("onActivityPaused");
} @Override
public void onActivityStopped(Activity activity) {
LogUtil.e("onActivityStopped");
count--;
if(count == 0){
isBackGround = true;
screenOnTime = System.currentTimeMillis();
}
} @Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) { LogUtil.e("onActivitySaveInstanceState");
} @Override
public void onActivityDestroyed(Activity activity) { LogUtil.e("onActivityDestroyed");
}
}
public class MyApplication extends android.support.multidex.MultiDexApplication {
public static AppStatusTracker tracker = new AppStatusTracker();
private ScreenOnOffReceiver screenOnOffReceiver = new ScreenOnOffReceiver();
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(true); // 是否输出debug日志
LogUtil.customTagPrefix="lpj"; registerActivityLifecycleCallbacks(tracker);
registerScreenReceiver(); } private void registerScreenReceiver(){
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(screenOnOffReceiver,intentFilter);
} }

判断App运行是否在前台的更多相关文章

  1. Android判断App是否在前台运行(转)

    原文地址: http://blog.csdn.net/zuolongsnail/article/details/8168689 Android开发中,有时候需要判断App是否在前台运行. 代码实现如下 ...

  2. 判断App是否在后台运行

    在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等.需求可能是多样化的,但所依仗的原理是相通的,今天Stay打算说说这些需求的最优解. ...

  3. 判断App整体处于前台还是后台

    1.通过RunningTaskInfo类判断(需要额外权限): 复制代码代码如下: /** *判断当前应用程序处于前台还是后台 */ public static boolean isApplicati ...

  4. android判断当前应用程序处于前台还是后台

    /**     *判断当前应用程序处于前台还是后台     *      * @param context * @return         */    public static boolean ...

  5. 【转】android IDE——通过DDMS查看app运行时所占内存情况

    在Android内存优化方面,我们不可能做到没有大内存的占用情况. 所以有时候要清楚我们的app到底占用了多少内存,哪一步操作占用了多少的内存. 这时候,android的ddms中提供了一个工具,是可 ...

  6. 判断当前应用程序处于前台还是后台 ANDROID

    /**     *判断当前应用程序处于前台还是后台     *      * @param context * @return         */    public static boolean ...

  7. 判断app是否是第一次启动

    如何判断app是否是第一启动呢,第一次启动的时候,加载引导页面等, 一下是我的解决方案: 1.在"AppDelegate.h"中找到- (BOOL)application:(UIA ...

  8. 判断app是否在后台

    1.通过RunningTaskInfo类判断(需要额外权限):(测试通过5.1可用,权限名称修改 <uses-permission android:name="android.perm ...

  9. iOS----------检测app进入后台或前台

    开发播放器的时候,经常需要检测app进入后台(暂停播放)或者进入前台(开始播放).方法非常简单. 1.检测app进入后台 // 在AppDelete实现该方法 - (void)applicationD ...

随机推荐

  1. C#之Lock

    lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. class Program { static void Main(string[] args) { Thre ...

  2. Java AOP nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice || Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0' 两个异常解决办法

    贴出applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  3. php截取utf-8中文字符串乱码的解决方法

    /** * PHP截取UTF-8字符串,解决半字符问题. * 英文.数字(半角)为1字节(8位),中文(全角)为2字节 * @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串 ...

  4. ThinkPHP模板中如何操作session,以及如果session中保存的是数组的情况

    在ThinkPHP的模板中操作session时,可以参考ThinkPHP参考文档中的“模板—>系统变量”部分,在默认模板引擎中,语法如下: {$Think.session.user} //输出s ...

  5. rocksDB 安装问题简单介绍

    前一段时间准备测试rocksdb,按照帖子和官网的例子,在安装过程中遇到一些问题.这里给出的是在Ubuntu下安装python使用的版本. 首先,要感谢这些帖子对我的帮助: 1:http://tech ...

  6. android editText 监听事件

    在软键盘中注意 在监听的 edittext中 使用android:imeOptions属性的时候,一定要对EditText设置 android:inputType 或者 设置 android:sing ...

  7. golang实现冒泡排序

    //BubbleSort.go package main import "fmt" func main() { , , , , , , , , ,} fmt.Println(val ...

  8. javafx之HTTP协议交互

    javafx端要获取获取如下信息: 服务器端获取的数据: javafx客户端发送的数据以及获取的数据: 工程目录: package Httputil; import IPsite.IPaddress; ...

  9. java中的foreach循环

    foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语 ...

  10. SIT_服务器系统整合测试总结

    从2012年到2015年我的3年服务器测试,感觉一下子时间就已经飞逝而过,一直希望做个前三年的工作总结,现在用我那笨拙的笔触记录下自己的三年服务器测试生活! ***2012-2013 SE 这一年基本 ...