[Android]应用的前后台运行
在开发中,你是不是没有抽象一个出常用的类,那你可能要为你的懒惰付出很大的代价。要时刻记得自己的工具箱,不断往里面添加一些小小玩意。今天就给大家带来一个很有意思的例子。前后台运行!!
在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]应用的前后台运行的更多相关文章
- Android实现程序前后台切换效果
本文演示如何在Android中实现程序前后台切换效果. 在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识. 我们都知道,一个Activity 可以启动另一个Act ...
- 在Android上使用qemu-user运行可执行文件
在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...
- Android M新的运行时权限开发者需要知道的一切
android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...
- Android M 新的运行时权限开发者需要知道的一切
android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...
- android的编译和运行过程深入分析
android的编译和运行过程深入分析 作者: 字体:[增加 减小] 类型:转载 首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,此过程对了解android的编译和运 ...
- Ubuntu TensorFlow 源码 Android Demo的编译运行
Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...
- 用代码如何检测一个android程序是否在运行
/** * 检测一个android程序是否在运行 * @param context * @param PackageName * @return */ public static boolean is ...
- 【转】android的编译和运行过程深入分析
首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,示意图如下,其中包含编译.链接和签名等: (1)使用aapt工具生成R.java文件 可以先通过搭建好的Eclipse ...
- Elasticsearch的前后台运行与停止(rpm包方式)
对应,这es的下载,需要rpm包. Elasticsearch-2.4.3的下载(图文详解) 建议用root用户 [root@djt002 elasticsearch-2.4.3]$ pwd/usr/ ...
随机推荐
- HDU 3661 Assignments (水题,贪心)
题意:n个工人,有n件工作a,n件工作b,每个工人干一件a和一件b,a[i] ,b[i]代表工作时间,如果a[i]+b[j]>t,则老板要额外付钱a[i]+b[j]-t;现在要求老板付钱最少: ...
- hibernate二级缓存ehcache
与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置缓 ...
- ssh 调优参数
#PermitRootLogin no 建议禁止它远程登录能力 #PermitEmptyPasswords no 禁止空密码登录 #UseDNS no 指定sshd是否应该对远程主机名进行反向 ...
- c#与java webservice调用问题
问题描述一: c#调用java写的websrevice,对方接收到的参数与实际传的值不一致,返回的时候值也获取不到,为null. 该参数为普通的string类型,因此不存在类型转换的问题. 处理: 使 ...
- UVA 439 Knight Moves
// 题意:输入标准国际象棋棋盘上的两个格子,求马最少需要多少步从起点跳到终点 BFS求最短路: bfs并维护距离状态cnt, vis记录是否访问过 #include<cstdio> ...
- 【转】GCC使用简介
Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一 ...
- IOS 7 开发范例 - UISwitch的使用
Creating and Using Switches with UISwitch You would like to give your users the ability to turn an o ...
- Educational Codeforces Round 1 D. Igor In the Museum bfs 并查集
D. Igor In the Museum Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598 ...
- 在WebClient中使用post[发送数据]
很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地.Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法 ...
- Oracle非重要文件恢复,redo、暂时文件、索引文件、password文件
增量备份的应用在recovery阶段.不再restore阶段 了解数据库设置表: SQL>desc database_properties Name ...