[Android]应用的前后台运行

时间:2022-12-15 21:19:22

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

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

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

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

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

好啦,贴代码:

package com.chaoxing.core;

import java.util.List;

import roboguice.activity.RoboActivity;
import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.app.ActivityManager.RunningAppProcessInfo; public class DefaultActivity extends Activity{ @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); appRunningInBackground = AppRunningInBackground.getInstance(getApplicationContext());
appRunningInBackground.onCreate();
} @Override
protected void onStart() {
super.onStart();
appRunningInBackground.onStart();
}
@Override
protected void onStop() {
super.onStop();
appRunningInBackground.onStop();
} private AppRunningInBackground appRunningInBackground ; }

fragmentActivity也是同理。

import java.util.List;

public class AppRunningInBackground {

	public static boolean notifyShowing = false;
public static boolean isSpecialSystem=false;
private boolean isInstance = false;
ActivityManager activityManager;
KeyguardManager keyguardManager;
private Context context = null;
private static AppRunningInBackground appRunningInBackground = null;
public static AppRunningInBackground getInstance(Context context){
synchronized (AppRunningInBackground.class) {
if(appRunningInBackground == null){
appRunningInBackground = new AppRunningInBackground(context);
} return appRunningInBackground;
} } public AppRunningInBackground(Context context) {
this.context = context;
}
public void onCreate() {
if(!isInstance){
activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
isInstance = true;
} } public void onStart() {
if(notifyShowing && appRunningInBackground != null){
notifyShowing = false;
Intent startIntent = new Intent(AppGlobalConfig.STARTACTIVITY);
context.sendBroadcast(startIntent);
}
} public void onStop() {
if(appRunningInBackground != null && !isAppOnForeground() ){
notifyShowing = true;
Intent startIntent = new Intent(AppGlobalConfig.STOPACTIVITY);
context.sendBroadcast(startIntent);
}
} /**
* 判断程序是否在前台
* @return true 在前台; false 在后台
*/
private boolean isAppOnForeground() {
if(!isSpecialSystem){
boolean isspecial=true;
String packageName = context.getPackageName();
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND||appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
return true;
}
if (keyguardManager.inKeyguardRestrictedInputMode()) return true;
}
if(isspecial){
if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
isspecial=false;
}
}
}
if(isspecial){
isSpecialSystem=true;
return !isApplicationBroughtToBackgroundByTask();
}
return false;
}else{
return !isApplicationBroughtToBackgroundByTask();
}
} /**
* 判断当前应用程序是否处于后台,通过getRunningTasks的方式
* @return true 在后台; false 在前台
*/
public boolean isApplicationBroughtToBackgroundByTask() {
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
if (!tasks.isEmpty()) {
ComponentName topActivity = tasks.get(0).topActivity;
if (!topActivity.getPackageName().equals(context.getPackageName())) {
return true;
}
}
return false;
}
}

[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的前后台运行与停止&lpar;rpm包方式)

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

随机推荐

  1. mybatis配置-返回date类型丢失时间

    此博客仅作于平时开发所遇到的问题记录,不做他用,描述可能不好,自己看懂即可~~ resultMap配置返回时间类型时,发现数据库时间是精确到秒的,但是返回给javabean之后丢失时分秒的信息,只有日 ...

  2. log4net的应用

    1.下载log4net 2编写log4net的配置文件 <?xml version="1.0" encoding="utf-8" ?> <co ...

  3. Markdown转pdf

    最近由于项目需要,要用到把markdown转换成pdf文件下载下来,最开始的时候想到的是先把markdown转成html,用到的是Parsedown:然后再将html转成pdf,用到了html2pdf ...

  4. Stern-Brocot Tree

    在<具体数学>4.5中看到了SB-Tree,觉得非常有趣,就去研究了一下. 首先介绍一下Stern-Brocot Tree.Stern-Brocot Tree是一种能将所有的最简分数都表示 ...

  5. Node 表单query

    //#使用nodejs编写动态的web服务器//1:加载需要模块 fs http urlconst fs = require("fs");const http = require( ...

  6. netcore 发布 到 windows server IIS

    net core 和普通net 发布没有什么不同,只需要在个别地方注意下: 1. 在visual Studio 2017 发布 2. 把发布好的文件copy到服务器上,并新建一个网站,同时要注意选择无 ...

  7. 基于 Web 的远程 Terminal 模拟器安装使用详解

    http://lzw.me/a/shellinabox.html 一.Shellinabox 简介 Shellinabox 是一个基于 web 的终端模拟器,采用 C 语言编写,使用 Ajax 与后端 ...

  8. xdebug远程调试原理分析

    xdebug可以控制PHP程序的执行,这意味着xdebug可以在任何时候暂停或者恢复正在运行的PHP程序.当PHP程序被暂停的时候,xdebug可以获取到程序的有关 信息,比如变量的值等.xdebug ...

  9. js 页面离开前触发事件

    当前窗口载入新的dom文档前发生 window.onbeforeunload = function(event) { return confirm("确定离开此页面吗?");

  10. Polar 投影c&num;版本移植

    from:http://hi.baidu.com/sungaoyong/item/0c4584d25873f131e3108f05 ///刘泽军java版本的极坐标投影c#版本的移植 using Sy ...