众所周知android是个开放性系统,所以系统提供的api往往都不够用,如果遇到了某些需求系统api满足不了我们,就需要自己研究了。

本文就是实现一个利用Application.ActivityLifecycleCallbacks与监听ACTION_SCREEN_OFF广播实现的检测app进入了前台还是后台功能。

一 :Application.ActivityLifecycleCallbacks

长这个样子的:

    public interface ActivityLifecycleCallbacks {void onActivityCreated(Activity activity, Bundle savedInstanceState);void onActivityStarted(Activity activity);void onActivityResumed(Activity activity);void onActivityPaused(Activity activity);void onActivityStopped(Activity activity);void onActivitySaveInstanceState(Activity activity, Bundle outState);void onActivityDestroyed(Activity activity);}

二:息屏广播

长这个样子的:

/ ** *广播操作:在设备进入睡眠状态并变为非交互状态时发送。 * <p> *由于历史原因,此广播操作的名称是指屏幕的电源状态,但实际上是根据设备总体交互状态的变化 而发送的。 *</p><p>*该广播是在设备变为非交互式时发送的,这可能与屏幕关闭无关。要确定屏幕的实际状态,请使用* {@link android.view.Display#getState}。 *</p><p>* 有关详细信息,请参见{@link android.os.PowerManager#isInteractive}。 * </p> * 您<em>不能</em>通过清单中声明的​​组件接收此消息,只有通过使用* {@link Context#registerReceiver(BroadcastReceiver,IntentFilter)* Context.registerReceiver()}进行显式注册才能收到此消息。 *  <p class =“ note”>这是一个受保护的意图,只能由系统发送。 * /public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";

三:结合一和二开始编写真正的帮助类AbsActivityLifecycle

长这个样子的:

import android.app.Activity;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;import java.util.WeakHashMap;/*** 有助于确定应用程序何时进入或离开前台。* 提供抽象方法来处理应用程序何时进入后台或前台。* 如果需要其他处理则可以覆盖任何活动生命周期回调。* 只需确保调用super方法,以使此类仍将按预期运行。*/
public abstract class AbsActivityLifecycle implements Application.ActivityLifecycleCallbacks {private static final String TAG = "AbsActivityLifecycle";private boolean inForeground = false;/*** 跟踪尚未停止的活动(包括重新启动的活动)的生命周期。*/private WeakHashMap<Activity, String> activityStringWeakHashMap = new WeakHashMap<>();/*** 构造函数。注册以接收活动生命周期事件。** @param application The Android Application class.*/public AbsActivityLifecycle(final Application application) {//注册ActivityLifecycleCallbacksapplication.registerActivityLifecycleCallbacks(this);//注册Intent.ACTION_SCREEN_OFFfinal ScreenOffReceiver screenOffReceiver = new ScreenOffReceiver();application.registerReceiver(screenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));}@Overridepublic void onActivityCreated(final Activity activity, final Bundle bundle) {Log.d(TAG, "onActivityCreated " + activity.getLocalClassName());handleOnCreateOrOnStartToHandleApplicationEnteredForeground();activityStringWeakHashMap.put(activity, "created");}@Overridepublic void onActivityStarted(final Activity activity) {Log.d(TAG, "onActivityStarted " + activity.getLocalClassName());handleOnCreateOrOnStartToHandleApplicationEnteredForeground();activityStringWeakHashMap.put(activity, "started");}@Overridepublic void onActivityResumed(final Activity activity) {Log.d(TAG, "onActivityResumed " + activity.getLocalClassName());activityStringWeakHashMap.put(activity, "resumed");}@Overridepublic void onActivityPaused(final Activity activity) {Log.d(TAG, "onActivityPaused " + activity.getLocalClassName());activityStringWeakHashMap.put(activity, "paused");}@Overridepublic void onActivityStopped(final Activity activity) {Log.d(TAG, "onActivityStopped " + activity.getLocalClassName());// 当活动停止时,我们将其从生命周期状态图中删除,因为不再考虑让会话保持活动状态。activityStringWeakHashMap.remove(activity);}@Overridepublic void onActivitySaveInstanceState(final Activity activity, final Bundle outState) {Log.d(TAG, "onActivitySaveInstanceState " + activity.getLocalClassName());}@Overridepublic void onActivityDestroyed(final Activity activity) {Log.d(TAG, "onActivityDestroyed " + activity.getLocalClassName());// 活动不应再位于activityLifecycleStateMap中。if (activityStringWeakHashMap.containsKey(activity)) {Log.e(TAG, "Destroyed activity present in activityLifecycleMap!?");activityStringWeakHashMap.remove(activity);}}//region 判断/*** Application.onTrimMemory()调用此方法。** @param level 从Application.onTrimMemory()传递的级别*/public void handleOnTrimMemory(final int level) {Log.d(TAG, "onTrimMemory " + level);// 如果没有任何活动在运行,并且该应用已进入后台。if (level >= Application.TRIM_MEMORY_UI_HIDDEN) {checkForApplicationEnteredBackground();}}/*** The BroadcastReceiver for Intent.ACTION_SCREEN_OFF*/private class ScreenOffReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {checkForApplicationEnteredBackground();}}/*** 从onActivityCreated和onActivityStarted调用以在应用程序进入前台时进行处理。*/private void handleOnCreateOrOnStartToHandleApplicationEnteredForeground() {//如果活动生命周期映射中没有任何内容指示我们可能在后台,并且标志表明我们确实在后台中。if (activityStringWeakHashMap.size() == 0 && !inForeground) {inForeground = true;// 由于在活动开始时会调用此方法,因此我们现在知道该应用程序已进入前台。applicationEnteredForeground();}}private void checkForApplicationEnteredBackground() {runOnUiThread(new Runnable() {@Overridepublic void run() {// 如果应用程序位于前台,并且不再有未停止的活动。if ((activityStringWeakHashMap.size() == 0) && inForeground) {inForeground = false;applicationEnteredBackground();}}});}/*** Run a runnable on the Main (UI) Thread.* @param runnable the runnable*/private static void runOnUiThread(final Runnable runnable) {if (Looper.myLooper() != Looper.getMainLooper()) {new Handler(Looper.getMainLooper()).post(runnable);} else {runnable.run();}}//endregion//region 回调/*** 当应用程序进入前台时回调。*/protected abstract void applicationEnteredForeground();/*** 应用程序进入后台时回调。*/protected abstract void applicationEnteredBackground();//endregion
}

最后如何使用:

1.自定义MyApplication

import android.app.Application;
import android.util.Log;/*** 自定义Application*/
public class MyApplication extends Application {private AbsActivityLifecycle absActivityLifecycle;@Overridepublic void onCreate() {super.onCreate();//帮助程序在构造时进行注册,以接收应用程序生命周期事件。// 这里保留了一个引用,以便通过// 应用程序类的onTrimMemory()调用来正确跟踪应用程序何时进入后台absActivityLifecycle = new AbsActivityLifecycle(this) {@Overrideprotected void applicationEnteredForeground() {Log.d("AbsActivityLifecycle", "-->applicationEnteredForeground");}@Overrideprotected void applicationEnteredBackground() {Log.d("AbsActivityLifecycle", "-->applicationEnteredBackground");}};}@Overridepublic void onTrimMemory(final int level) {if (absActivityLifecycle != null) {absActivityLifecycle.handleOnTrimMemory(level);}super.onTrimMemory(level);}
}

2.清单文件中使用自己定义的MyApplication

  <applicationandroid:name=".application.MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/BaseAppTheme"tools:ignore="GoogleAppIndexingWarning">

如何知道你的app进入了前台还是后台相关推荐

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

    转载请注明转自:[noyet12的博客](http://blog.csdn.net/u012975705) 博客原址:http://blog.csdn.net/u012975705/article/d ...

  2. android 判断App进程是否存在,处在前台,后台,前后台切换,service是否运行,设置为系统app

    1.判断进程是否存在 //判断是否在主进程,这个方法判断进程名或者pid都可以,如果进程名一样那pid肯定也一样 //true:当前进程是主进程 false:当前进程不是主进程 public bool ...

  3. 安卓判断APP是在前台还是在后台

    安卓中判断APP是否在前台: 方法一:CCApplication 中判断 private boolean mIsInForeground = false; public boolean isInFor ...

  4. Android 判断app是否在前台还是在后台运行

    Android 判断app是否在前台还是在后台运行,直接看代码,可直接使用. [java]  view plain copy public static boolean isBackground(Co ...

  5. 如何判断app在前台还是后台

    项目遇到一个轮训,有通知就toast.但是toast是可以不受actvity控制的,当我按home键让app常驻后台后,我要他不吐司,这时候我们需要判断app在前台还是后台. 发挥谷歌搜索的威力 Ch ...

  6. app点餐点菜订餐订菜系统(前台h5,后台Java,SSH,mysql)

    app点餐点菜系统(前台h5,后台Java,SSH,mysql) [项目包含内容] [文档包含内容] [项目功能介绍] 这个系统是一个网上订餐系统,给商家提供一个新的营销平台,商户可以选择性地入驻这个 ...

  7. 新闻APP前台和后台管理系统 MVP+Dragger2+RxJava+RetroFit

    一 系统说明 该新闻资讯APP 主要是用户可以查看各种各样的新闻资讯,并且可以进行注册,登录账号,评论,收藏,取消收藏,浏览新闻,发布新闻,修改修改,删除新闻,用户管理,个人信息等操作,该APP分为前 ...

  8. 基于Android的漫画阅读器App设计与实现,安卓、MySQL、Java、Andriod Studio,前台用户+后台管理,完美运行,有一万五千字论文。

    基于Android的漫画阅读器App设计与实现,安卓.MySQL.Java.Andriod Studio,前台用户+后台管理,完美运行,有一万五千字论文. 用户模块功能: 引导页:首先进入APP之后会 ...

  9. 手机app h5 mysql_app点餐点菜订餐订菜系统(前台h5,后台Java,SSH,mysql)

    知乎视频​www.zhihu.com 点菜系统(前台h5,后台,mysql)的设计与实现(毕业论文10000字以上,共37页,程序代码,MySQL数据库) [项目包含内容] [文档包含内容] [项目功 ...

最新文章

  1. 从事仪表专业学c语言有用吗,仪器仪表工程就业方向
  2. ALSA声卡笔记3--ASoC驱动重要结构体关系图
  3. 穿透Session 0 隔离(一)
  4. java 智能家居管理系统_智能家居系统手机客户端应用源码
  5. 武术与软件设计 - 简单即是最好
  6. 最全面的关于LINUX与UNIX下的dd命令详解
  7. 什么叫目标,什么叫事业,写得让我失眠!也送给我自己
  8. Windows 环境安装 RabbitMQ
  9. ubuntu记录pdf手写笔记: 数位板(硬件)+xournal(软件)
  10. 游戏设计的100个原理(11-15)
  11. 豆瓣fm android,豆瓣FM for Android
  12. ::设计·创意·插画::相关网站巨集!
  13. 异或、或、与(且)的运算
  14. APP的缓存文件到底应该存在哪?
  15. 几种常见硬盘分区工具的对比
  16. 华为推出首款折叠屏5G手机;微信“上车”时间已定;社区团购暗潮涌动...
  17. 面试-Senior Specialist for Devops-车企
  18. SSM前后端分离技术
  19. Android屏幕截屏(全屏bitmap)
  20. fork-join 和begin-end

热门文章

  1. Oracle数据库对小数点的操作
  2. 关于#include iomanip中iomanip的作用~
  3. 互联收集金融,其实是门苦商业
  4. 网件路由器虚拟服务器在哪里,网件路由器怎么设置端口映射
  5. 苹果中国渠道裂变 揭秘郭台铭兄弟开店计划
  6. 带你轻松理解Zookeeper的选举机制
  7. 让心爱的TA不再孤单——Python微信聊天机器人
  8. python3利用正则表达式爬取内涵段子
  9. 编译并测试 android goldfish kernel x86
  10. 3月plog:恩墨er的DNA动了