Android 前台与后台监听

  1 package com.triaged.badge.helpers;
  2
  3 import android.app.Activity;
  4 import android.app.Application;
  5 import android.content.Context;
  6 import android.os.Bundle;
  7 import android.os.Handler;
  8
  9 import com.triaged.badge.app.App;
 10
 11 import java.util.List;
 12 import java.util.concurrent.CopyOnWriteArrayList;
 13
 14 /**
 15  * Usage:
 16  *
 17  * 1. Get the Foreground Singleton, passing a Context or Application object unless you
 18  * are sure that the Singleton has definitely already been initialised elsewhere.
 19  *
 20  * 2.a) Perform a direct, synchronous check: Foreground.isForeground() / .isBackground()
 21  *
 22  * or
 23  *
 24  * 2.b) Register to be notified (useful in Service or other non-UI components):
 25  *
 26  *   Foreground.Listener myListener = new Foreground.Listener(){
 27  *       public void onBecameForeground(){
 28  *           // ... whatever you want to do
 29  *       }
 30  *       public void onBecameBackground(){
 31  *           // ... whatever you want to do
 32  *       }
 33  *   }
 34  *
 35  *   public void onCreate(){
 36  *      super.onCreate();
 37  *      Foreground.get(this).addListener(listener);
 38  *   }
 39  *
 40  *   public void onDestroy(){
 41  *      super.onCreate();
 42  *      Foreground.get(this).removeListener(listener);
 43  *   }
 44  */
 45 public class Foreground implements Application.ActivityLifecycleCallbacks {
 46
 47     public static final long CHECK_DELAY = 500;
 48     public static final String TAG = Foreground.class.getName();
 49
 50     public interface Listener {
 51
 52         public void onBecameForeground();
 53
 54         public void onBecameBackground();
 55
 56     }
 57
 58     private static Foreground instance;
 59
 60     private boolean foreground = false, paused = true;
 61     private Handler handler = new Handler();
 62     private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
 63     private Runnable check;
 64
 65     /**
 66      * Its not strictly necessary to use this method - _usually_ invoking
 67      * get with a Context gives us a path to retrieve the Application and
 68      * initialise, but sometimes (e.g. in test harness) the ApplicationContext
 69      * is != the Application, and the docs make no guarantees.
 70      *
 71      * @param application
 72      * @return an initialised Foreground instance
 73      */
 74     public static Foreground init(Application application){
 75         if (instance == null) {
 76             instance = new Foreground();
 77             application.registerActivityLifecycleCallbacks(instance);
 78         }
 79         return instance;
 80     }
 81
 82     public static Foreground get(Application application){
 83         if (instance == null) {
 84             init(application);
 85         }
 86         return instance;
 87     }
 88
 89     public static Foreground get(Context ctx){
 90         if (instance == null) {
 91             Context appCtx = ctx.getApplicationContext();
 92             if (appCtx instanceof Application) {
 93                 init((Application)appCtx);
 94             }
 95             throw new IllegalStateException(
 96                     "Foreground is not initialised and " +
 97                             "cannot obtain the Application object");
 98         }
 99         return instance;
100     }
101
102     public static Foreground get(){
103         if (instance == null) {
104             throw new IllegalStateException(
105                     "Foreground is not initialised - invoke " +
106                             "at least once with parameterised init/get");
107         }
108         return instance;
109     }
110
111     public boolean isForeground(){
112         return foreground;
113     }
114
115     public boolean isBackground(){
116         return !foreground;
117     }
118
119     public void addListener(Listener listener){
120         listeners.add(listener);
121     }
122
123     public void removeListener(Listener listener){
124         listeners.remove(listener);
125     }
126
127     @Override
128     public void onActivityResumed(Activity activity) {
129         paused = false;
130         boolean wasBackground = !foreground;
131         foreground = true;
132
133         if (check != null)
134             handler.removeCallbacks(check);
135
136         if (wasBackground){
137             App.gLogger.i( "went foreground");
138             for (Listener l : listeners) {
139                 try {
140                     l.onBecameForeground();
141                 } catch (Exception exc) {
142                    App.gLogger.e( "Listener threw exception!", exc);
143                 }
144             }
145         } else {
146             App.gLogger.i( "still foreground");
147         }
148     }
149
150     @Override
151     public void onActivityPaused(Activity activity) {
152         paused = true;
153
154         if (check != null)
155             handler.removeCallbacks(check);
156
157         handler.postDelayed(check = new Runnable(){
158             @Override
159             public void run() {
160                 if (foreground && paused) {
161                     foreground = false;
162                     App.gLogger.i( "went background");
163                     for (Listener l : listeners) {
164                         try {
165                             l.onBecameBackground();
166                         } catch (Exception exc) {
167                            App.gLogger.e( "Listener threw exception!", exc);
168                         }
169                     }
170                 } else {
171                     App.gLogger.i( "still foreground");
172                 }
173             }
174         }, CHECK_DELAY);
175     }
176
177     @Override
178     public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
179
180     @Override
181     public void onActivityStarted(Activity activity) {}
182
183     @Override
184     public void onActivityStopped(Activity activity) {}
185
186     @Override
187     public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
188
189     @Override
190     public void onActivityDestroyed(Activity activity) {}
191 }
时间: 2024-10-26 19:12:19

Android 前台与后台监听的相关文章

Android中检查、监听电量和充电状态的方法

Android中检查.监听电量和充电状态的方法 这篇文章主要介绍了Android中检查.监听电量和充电状态的方法,如判断当前充电状态.监听充电状态的改变.判断当前剩余电量等,需要的朋友可以参考下 当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始. 电池寿命通过剩余电量和充电状态来影响应用更新的执行.当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快.如果设备不在充电,降低更新频率可以帮助延长电池寿命.

Android Back Home键监听

Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Override public void onBackPressed() { // super.onBackPressed();//注释掉这行,back键不退出activity Log.i(LOG_TAG, "onBackPressed"); } @Override public boolean dis

[android] 网络断开的监听

标签: android 网络监听 杂谈 分类: Android [转自]  http://blog.sina.com.cn/s/blog_5d5996d001012o07.html 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就可以实现网络的监听,下面是代码--- onCreate的时候实例化 //监听器     private NetState receiver=new NetSta

Android截屏事件监听

转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/53737655 1. 前言 Android系统没有直接对截屏事件监听的接口,也没有广播,只能自己动手来丰衣足食,一般有三种方法. 利用FileObserver监听某个目录中资源变化情况 利用ContentObserver监听全部资源的变化 监听截屏快捷按键 由于厂商自定义Android系统的多样性,再加上快捷键的不同以及第三方应用,监听截屏快捷键这事基本不靠谱,可以直接忽略. 本文使用

Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

我之前写了一篇关于美团网,大众点评的购买框效果的文章Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果,我自己感觉效果并不是很好,如果快速滑动界面,显示悬浮框的时候会出现一卡的现象,有些朋友说有时候会出现两个布局的情况,特别是对ScrollView滚动的Y值得监听,我还使用了Handler来获取,还有朋友给我介绍了Scrolling Tricks这个东西,我下载试了下,确实美团网,大众点评的购买框用的是这种效果,但是Scrolling Tricks只能在API11以上

android之 TextWatcher的监听

以前用过android.text.TextWatcher来监听文本发生变化,但没有仔细去想它,今天兴致来了就发个疯来玩玩吧! 有点担心自己理解错,所以还是先把英文API解释给大家看看 1.什么情况下使用了? When an object of a type is attached to an Editable, its methods will be called when the text is changed. 2.下面是它的三个抽象方法 /** *This method is called

Android学习按键事件监听与Command模式

Android学习按键事件监听与Command模式 - Dufresne - 博客园 ? 一 Command模式 意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作. 将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者, 实现了动作的请求者对象和动作的执行者对象之间的解耦合. 适用性: 使用Command模式代替callback形式的回调应用: 在不同的时刻指定.排列和执行请

Android EditText截获与监听输入事件

Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { textview.setText(edittext.getText()); return fal

Android开发之怎样监听让Service不被杀死

一.Service简单介绍 Service是在一段不定的时间执行在后台,不和用户交互应用组件. 每一个Service必须在manifest中 通过<service>来声明. 能够通过contect.startservice和contect.bindserverice来启动.和其它的应用组件一样,执行在进程的主线程中.这就是说假设service须要非常多耗时或者堵塞的操作,须要在其子线程中实现(或者用系统提供的IntentService,它继承了Service,它处理数据是用自身新开的线程).