[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/ ...
随机推荐
- Dapper基础用法
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.点击下载Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后 ...
- 【转】有向图强连通分量的Tarjan算法
原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
- java 2 8 10 16
An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8), or ...
- [Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
主要讲解Android Studio中生成aar文件以及本地方式使用aar文件的方法. 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件. 分别存储位置 ...
- 怎么去掉li标签前面的点??
<ul class="list"> <li> </li> <li> </li> </ul> .list li ...
- HDU 5510 Bazinga 暴力匹配加剪枝
Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...
- C#.NET开发ActiveX控件
最近刚开发了个activeX控件,下面是我的一些简单总结. 1. 先创建一个类库项目,在AssemblyInfo.cs设置 [assembly: ComVisible(true)] ,意思是使此程序集 ...
- osg通过glsl实现一个平面的水效果(法线贴图) 【转】
转自 http://blog.sina.com.cn/s/blog_78ea87380101ehk3.html 此文实现一个简单的的水面效果,主要是法线贴图, 效果图如下: 此文分为三部分:ver ...
- rtp的封包与拆包h264
请看文档rfc3984 1.看h264的帧 SPS序列參数帧 00 00 00 01 67 64 . . .. PPS图像參数帧 00 00 00 01 68 EE... . I帧 00 00 00 ...
- Allegro批量复制Via并保持net属性
使用Allegro时须要批量复制net属性是GND或是其他属性的Via: 批量选中Via后点击Copy或'Shift+F5' 然后完毕复制,如图: 复制完.我们可能发现,这些复制的Via的net属性不 ...