Android判断APP是在前台还是后台
16lz
2021-01-23
1 继承Application.ActivityLifecycleCallbacks ,需要API > 14 , 现在基本上Android机都能达到这个要求。
public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks {
public static final long CHECK_DELAY = 500;
public static final String TAG = ForegroundCallbacks.class.getName();
public interface Listener { public void onBecameForeground(); public void onBecameBackground();}private static ForegroundCallbacks instance;private boolean foreground = false, paused = true;private Handler handler = new Handler();private List listeners = new CopyOnWriteArrayList();private Runnable check;public static ForegroundCallbacks init(Application application) { if (instance == null) { instance = new ForegroundCallbacks(); application.registerActivityLifecycleCallbacks(instance); } return instance;}public static ForegroundCallbacks get(Application application) { if (instance == null) { init(application); } return instance;}public static ForegroundCallbacks get(Context ctx) { if (instance == null) { Context appCtx = ctx.getApplicationContext(); if (appCtx instanceof Application) { init((Application) appCtx); } throw new IllegalStateException( "Foreground is not initialised and " + "cannot obtain the Application object"); } return instance;}public static ForegroundCallbacks get() { if (instance == null) { throw new IllegalStateException( "Foreground is not initialised - invoke " + "at least once with parameterised init/get"); } return instance;}public boolean isForeground() { return foreground;}public boolean isBackground() { return !foreground;}public void addListener(Listener listener) { listeners.add(listener);}public void removeListener(Listener listener) { listeners.remove(listener);}@Overridepublic void onActivityResumed(Activity activity) { paused = false; boolean wasBackground = !foreground; foreground = true; if (check != null) handler.removeCallbacks(check); if (wasBackground) { A.e("went foreground"); for (Listener l : listeners) { try { l.onBecameForeground(); } catch (Exception exc) { A.e("Listener threw exception!", exc); } } } else { A.e("still foreground"); }}@Overridepublic void onActivityPaused(Activity activity) { paused = true; if (check != null) handler.removeCallbacks(check); handler.postDelayed(check = new Runnable() { @Override public void run() { if (foreground && paused) { foreground = false; A.e("went background"); for (Listener l : listeners) { try { l.onBecameBackground(); } catch (Exception exc) { A.e("Listener threw exception!", exc); } } } else { A.e("still foreground"); } } }, CHECK_DELAY);}@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}
}
2 在Application中注册事件:
callback = ForegroundCallbacks.init(this);
callback.addListener(new Listener() {
@Override public void onBecameForeground() { startService(new Intent(AppContext.this, CheckVipService.class)); System.out.println("---------------------------- 前台"); } @Override public void onBecameBackground() { System.out.println("---------------------------- 后台"); } });
更多相关文章
- 后台动态添加布局文件、控件与动态设置属性
- :Android实现程序前后台切换效果
- Android清理后台所有历史App任务
- 【android】关于退出时关闭“后台”显示
- Android实现程序前后台切换效果
- android后台进程隐藏手段
- android的service中在后台弹出提示框
- Android 保活后台启动Service 8.0踩坑记录
- 如何隐藏Activity的界面,让其在后台运行