转自: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. java 从数据删除指定值

    public class ArrayRemoveValue { public static void main(String[] args) { Integer[] _IntArray = new I ...

  2. AsyncTask

    package com.gg.test; import java.io.IOException; import org.apache.http.HttpResponse;import org.apac ...

  3. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  4. 【Python④】python恼人的字符串,格式化输出

    恼人的字符串 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码 ...

  5. [CodeForces - 712D]Memory and Scores (DP 或者 生成函数)

    题目大意: 两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高.  ( ...

  6. 面试复习(C++)之归并排序

    #include <iostream> #include<stdlib.h>//引入malloc using namespace std; void Merge(int *a, ...

  7. AnyCAD.NET C#开发CAD软件实践(一)

    免费的AnyCAD.NET发布了!俺喜欢的C#有了大展前途的机会了. 打算用这个框架搭建一套实用的CAD系统,目标是能买出去10套以上. 先看看AnyCAD.NET的自我介绍. http://www. ...

  8. 关于编译报错“dereferencing pointer to incomplete type...

    今天同事问了我一个问题,他make的时候报错,“第201行:dereferencing pointer to incomplete type”,我随即查阅了很多资料,也没看出个所以然.最后问题得到了解 ...

  9. python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一 ...

  10. http状态消息

    1-5状态码了解 1XX 表示信息(消息) 2XX 表示成功 3XX 表示重定向 4XX 表示请求错误 *** 5XX 表示服务端错误 常见状态码 200 请求成功 一切正常 301 重定向,修改后的 ...