在开发中,你是不是没有抽象一个出常用的类,那你可能要为你的懒惰付出很大的代价。要时刻记得自己的工具箱,不断往里面添加一些小小玩意。今天就给大家带来一个很有意思的例子。前后台运行!!

在Android开发中为了使用的方便要把所有的Activity包裹一层形成自己的activity,比如这个activity在创建时加入到一个容器里,在ondestroy时及时清除,可以通过Application管理activity,这个是今天我要介绍的项目背景。

好了,我就直接开始切入题目。

前台,就是当前显示运行的是自己的App;后台,就是自己的App不是激活或者说项目的Activity不在activity堆栈的最顶端。那如何判断呢?

我们离开自己的app可能是通过按键或顶端的提示,亦或者是中途的电话打断,总而言之,就是Activity不是出于运行的状态,所以我们的目标就是监听所有的Activity的状态!!咋一听吓死了,我的项目有好多Activity呢?别忘了我开始说的 我把每个Activity继承于自己的Activity啦,所以实际上我只需要监听一个啦。

好啦,贴代码:

  1. package com.chaoxing.core;
  2.  
  3. import java.util.List;
  4.  
  5. import roboguice.activity.RoboActivity;
  6. import android.app.ActivityManager;
  7. import android.app.KeyguardManager;
  8. import android.app.ActivityManager.RunningAppProcessInfo;
  9.  
  10. public class DefaultActivity extends Activity{
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14.  
  15. super.onCreate(savedInstanceState);
  16.  
  17. appRunningInBackground = AppRunningInBackground.getInstance(getApplicationContext());
  18. appRunningInBackground.onCreate();
  19. }
  20.  
  21. @Override
  22. protected void onStart() {
  23. super.onStart();
  24. appRunningInBackground.onStart();
  25. }
  26. @Override
  27. protected void onStop() {
  28. super.onStop();
  29. appRunningInBackground.onStop();
  30. }
  31.  
  32. private AppRunningInBackground appRunningInBackground ;
  33.  
  34. }

fragmentActivity也是同理。

  1. import java.util.List;
  2.  
  3. public class AppRunningInBackground {
  4.  
  5. public static boolean notifyShowing = false;
  6. public static boolean isSpecialSystem=false;
  7. private boolean isInstance = false;
  8. ActivityManager activityManager;
  9. KeyguardManager keyguardManager;
  10. private Context context = null;
  11. private static AppRunningInBackground appRunningInBackground = null;
  12. public static AppRunningInBackground getInstance(Context context){
  13. synchronized (AppRunningInBackground.class) {
  14. if(appRunningInBackground == null){
  15. appRunningInBackground = new AppRunningInBackground(context);
  16. }
  17.  
  18. return appRunningInBackground;
  19. }
  20.  
  21. }
  22.  
  23. public AppRunningInBackground(Context context) {
  24. this.context = context;
  25. }
  26. public void onCreate() {
  27. if(!isInstance){
  28. activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
  29. keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
  30. isInstance = true;
  31. }
  32.  
  33. }
  34.  
  35. public void onStart() {
  36. if(notifyShowing && appRunningInBackground != null){
  37. notifyShowing = false;
  38. Intent startIntent = new Intent(AppGlobalConfig.STARTACTIVITY);
  39. context.sendBroadcast(startIntent);
  40. }
  41. }
  42.  
  43. public void onStop() {
  44. if(appRunningInBackground != null && !isAppOnForeground() ){
  45. notifyShowing = true;
  46. Intent startIntent = new Intent(AppGlobalConfig.STOPACTIVITY);
  47. context.sendBroadcast(startIntent);
  48. }
  49. }
  50.  
  51. /**
  52. * 判断程序是否在前台
  53. * @return true 在前台; false 在后台
  54. */
  55. private boolean isAppOnForeground() {
  56. if(!isSpecialSystem){
  57. boolean isspecial=true;
  58. String packageName = context.getPackageName();
  59. List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
  60. if (appProcesses == null)
  61. return false;
  62. for (RunningAppProcessInfo appProcess : appProcesses) {
  63. if (appProcess.processName.equals(packageName)) {
  64. if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND||appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
  65. return true;
  66. }
  67. if (keyguardManager.inKeyguardRestrictedInputMode()) return true;
  68. }
  69. if(isspecial){
  70. if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
  71. isspecial=false;
  72. }
  73. }
  74. }
  75. if(isspecial){
  76. isSpecialSystem=true;
  77. return !isApplicationBroughtToBackgroundByTask();
  78. }
  79. return false;
  80. }else{
  81. return !isApplicationBroughtToBackgroundByTask();
  82. }
  83. }
  84.  
  85. /**
  86. * 判断当前应用程序是否处于后台,通过getRunningTasks的方式
  87. * @return true 在后台; false 在前台
  88. */
  89. public boolean isApplicationBroughtToBackgroundByTask() {
  90. List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
  91. if (!tasks.isEmpty()) {
  92. ComponentName topActivity = tasks.get(0).topActivity;
  93. if (!topActivity.getPackageName().equals(context.getPackageName())) {
  94. return true;
  95. }
  96. }
  97. return false;
  98. }
  99. }

[Android]应用的前后台运行的更多相关文章

  1. Android实现程序前后台切换效果

    本文演示如何在Android中实现程序前后台切换效果. 在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识. 我们都知道,一个Activity 可以启动另一个Act ...

  2. 在Android上使用qemu-user运行可执行文件

    在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...

  3. Android M新的运行时权限开发者需要知道的一切

    android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...

  4. Android M 新的运行时权限开发者需要知道的一切

    android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...

  5. android的编译和运行过程深入分析

    android的编译和运行过程深入分析 作者: 字体:[增加 减小] 类型:转载 首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,此过程对了解android的编译和运 ...

  6. Ubuntu TensorFlow 源码 Android Demo的编译运行

    Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...

  7. 用代码如何检测一个android程序是否在运行

    /** * 检测一个android程序是否在运行 * @param context * @param PackageName * @return */ public static boolean is ...

  8. 【转】android的编译和运行过程深入分析

    首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,示意图如下,其中包含编译.链接和签名等: (1)使用aapt工具生成R.java文件 可以先通过搭建好的Eclipse ...

  9. Elasticsearch的前后台运行与停止(rpm包方式)

    对应,这es的下载,需要rpm包. Elasticsearch-2.4.3的下载(图文详解) 建议用root用户 [root@djt002 elasticsearch-2.4.3]$ pwd/usr/ ...

随机推荐

  1. Dapper基础用法

    假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后 ...

  2. 【转】有向图强连通分量的Tarjan算法

    原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

  3. java 2 8 10 16

    An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8), or ...

  4. [Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法

    主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法. 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件. 分别存储位置 ...

  5. 怎么去掉li标签前面的点??

    <ul class="list"> <li> </li> <li> </li> </ul> .list li ...

  6. HDU 5510 Bazinga 暴力匹配加剪枝

    Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...

  7. C#.NET开发ActiveX控件

    最近刚开发了个activeX控件,下面是我的一些简单总结. 1. 先创建一个类库项目,在AssemblyInfo.cs设置 [assembly: ComVisible(true)] ,意思是使此程序集 ...

  8. osg通过glsl实现一个平面的水效果(法线贴图) 【转】

    转自 http://blog.sina.com.cn/s/blog_78ea87380101ehk3.html 此文实现一个简单的的水面效果,主要是法线贴图, 效果图如下:   此文分为三部分:ver ...

  9. rtp的封包与拆包h264

    请看文档rfc3984 1.看h264的帧 SPS序列參数帧 00 00 00 01 67 64 . . .. PPS图像參数帧 00 00 00 01 68 EE... . I帧 00 00 00 ...

  10. Allegro批量复制Via并保持net属性

    使用Allegro时须要批量复制net属性是GND或是其他属性的Via: 批量选中Via后点击Copy或'Shift+F5' 然后完毕复制,如图: 复制完.我们可能发现,这些复制的Via的net属性不 ...