判断App运行是否在前台
转自: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运行是否在前台的更多相关文章
- Android判断App是否在前台运行(转)
原文地址: http://blog.csdn.net/zuolongsnail/article/details/8168689 Android开发中,有时候需要判断App是否在前台运行. 代码实现如下 ...
- 判断App是否在后台运行
在一些场景中,经常会需要判断App是否在后台运行,比如是否显示解锁界面,收到新消息是否显示Notification等.需求可能是多样化的,但所依仗的原理是相通的,今天Stay打算说说这些需求的最优解. ...
- 判断App整体处于前台还是后台
1.通过RunningTaskInfo类判断(需要额外权限): 复制代码代码如下: /** *判断当前应用程序处于前台还是后台 */ public static boolean isApplicati ...
- android判断当前应用程序处于前台还是后台
/** *判断当前应用程序处于前台还是后台 * * @param context * @return */ public static boolean ...
- 【转】android IDE——通过DDMS查看app运行时所占内存情况
在Android内存优化方面,我们不可能做到没有大内存的占用情况. 所以有时候要清楚我们的app到底占用了多少内存,哪一步操作占用了多少的内存. 这时候,android的ddms中提供了一个工具,是可 ...
- 判断当前应用程序处于前台还是后台 ANDROID
/** *判断当前应用程序处于前台还是后台 * * @param context * @return */ public static boolean ...
- 判断app是否是第一次启动
如何判断app是否是第一启动呢,第一次启动的时候,加载引导页面等, 一下是我的解决方案: 1.在"AppDelegate.h"中找到- (BOOL)application:(UIA ...
- 判断app是否在后台
1.通过RunningTaskInfo类判断(需要额外权限):(测试通过5.1可用,权限名称修改 <uses-permission android:name="android.perm ...
- iOS----------检测app进入后台或前台
开发播放器的时候,经常需要检测app进入后台(暂停播放)或者进入前台(开始播放).方法非常简单. 1.检测app进入后台 // 在AppDelete实现该方法 - (void)applicationD ...
随机推荐
- Laravel框架 mysql 数据库 —— 基本使用
增删改查 配置完数据库连接,就可以使用DB类进行查询了. 查询 $results = DB::select('select * from users where id = ?', array(1)); ...
- CSS大美集
细节1……………………………………………………………………………… 一.当文字与图片在一行,需要将文字与图片底对齐,可以这样写: <div>记住密码<img src="im ...
- 一个Woker类,当id和name相同时,系统判断两个工人是相等的,打印工人对象时显示“工人:id和name”。
public class Worker { private int id; private String name; private double salary; public boolean equ ...
- Nginx配置单主机多域名
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; ...
- Qt中2D绘图问题总结(二)----------坐标系统
坐标系统 使用QPainter绘制时使用到逻辑坐标,然后转换成绘图设备的物理坐标. 逻辑坐标到物理坐标的映射由QPainter的worldTransform()函数.QPainter的viewport ...
- SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...
- RBAC类的方法
rbac类的 方法 authenticate($map,$model='')方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息 saveAccessList($authId=null ...
- Android TelephonyManager电话管理器
今天介绍一下Android的电话管理器--TelephonyManager,TelephonyManager管理手机通话状态.电话网络信息的服务类,获取TelephonyManager: Teleph ...
- hibernate的一种报错
Exception in thread "main" java.lang.NoClassDefFoundError: javax/tools/StandardJavaFileMan ...
- arm嵌入式交叉编译工具链
1.arm-linux-gcc 常用的参数:-o[制定输出文件名] -c[只到编译停止,不连接] -g[键入调试信息] -xO[优化级别] -w/W(警告等级) arm-linux-gcc -o de ...