如何判断android activity是否运行
android对于我们来说是一个复杂的且拥有多种逻辑类别的系统。这对于我们来说是一件好事但是也给我们带来处理一个相同问题会带来更多的复杂性。接下来我们会检查activity是否在你的应用中存在
介绍
我们会需要一个持续运行的服务,这个服务会从远程站点获取信息或者做类似事情来给我们带来一些特殊利益。在当时我这个服务获取到一些信息并传送到activity中。如果这个activity运行在前端那并没有什么问题,然后我们怎么确定activity运行在前端呢?
这个问题有多重决绝方法,所有的方法都有利有弊。我们将展现所有的处理方法并列出利弊
ActivityManager
首先我们关注下ActivityManager(AM)。AM维持了一个运行时任务记录和最上层任务记录。也许AM中最后的一个任务就是我们的兴趣所在
public boolean isForeground(String PackageName){ // Get the Activity Manager ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); // Get a list of running tasks, we are only interested in the last one, // the top most so we give a 1 as parameter so we only get the topmost. List< ActivityManager.RunningTaskInfo > task = manager.getRunningTasks(1); // Get the info we need for comparison. ComponentName componentInfo = task.get(0).topActivity; // Check if it matches our package name. if(componentInfo.getPackageName().equals(PackageName)) return true; // If not then our app is not on the foreground. return false; }
利:你可以直接的得到你需要的信息,但是更准确的说google对于其还有歧义的,google强烈建议你仅在调试模式下使用。
利:没有保存任意类型的变量,只是查看了android的任务栈,所以无论在什么原因下没有任何东西会被删除。
弊:获取最顶层的应用或许不是最完整的解决方案。因为你的app可能有很多原因造成其不是一个顶端app,但我们依旧会认为他依然在最顶端并按照此推断去处理。
弊:google文档明确的指出不要使用这段代码除了在调试或者管理任务接口时,所以这不是一个可靠的方式并且在未来的android版本也将不可靠
弊:你必须在manifest配置中增加GET_TASKS的权限,这或许不是那么友好吧
弊:由于我们没有系统的控制权,所以你将不会知道系统在任何情况下是怎么处理的,所以你只能假设这一切都运行的非常完好,并且在我们的使用者中这一切在任何情况下都没有发生。
static variable
从代码层面上,最简单的方法就是使用静态变量,静态变量在现代编码中被使用的非常多且总是备受争议,但是我们依旧在很多地方看到并使用。
public class example extends Activity { static boolean isActive = false; @Override protected void onStart() { super.onStart(); isActive = true; } @Override protected void onStop() { super.onStop(); isActive = false; } }
利:非常简便的代码
利:很难被用户或者android自身回收
利:你可以有很高的控制权并很容易的按照你的实现将Activity分类,就如同最上层Activity这么一个分类
弊:静态变量等等其他变量是被关联到一个类实例的,这就是意味着只有类加载器加载的类被卸载了这些变量才会被卸载。一般来说只有当应用被杀死后静态变量才会一起被杀死。然后android在一般情况下不会销毁一些老的历史任务。我们需要注意,如果我们申明一个静态Activity或者context,且静态变量存在复杂的引用关系,那么其不会被销毁,更可怕的是可能带来内存泄露问题。所以请确保当你不在需要这些静态变量时,把他们赋值成null,以让垃圾回收机制处理。在我们的例子中并不是一个反面例子,我们只是存储了一个boolean类型的值,这不会带来内存泄露问题,但是你依然需要清楚静态变量会带来什么,这就是为什么网络上市场出现这类讨论的原因。
弊:如上的函数并不会一直被调用,所以得不到一个真实的状态。如果一个app崩溃了,其不会调用onStop()函数。你可以通过定义一个默认的异常处理机制来弥补这个问题,并把状态设定成false。可能还有更多的情况我们未控制,但也有其他觉得方法。
弊:尽管静态变量在被销毁后,再次初始化可以被赋予他们的默认值,但这也会在某些情况下带来不可预料的情况。例如崩溃
shared preferences
和静态变量类似,shared preferences 可以共享其他Activity和service的状态
public class example extends Activity { @Override protected void onStart() { super.onStart(); // Store our shared preference SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE); Editor ed = sp.edit(); ed.putBoolean("active", true); ed.commit(); } @Override protected void onStop() { super.onStop(); // Store our shared preference SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE); Editor ed = sp.edit(); ed.putBoolean("active", false); ed.commit(); } }
利:shared preferences 不会被android销毁
利:shared preferences 不会被重置成默认值
利:
你可以有很高的控制权并很容易的按照你的实现将Activity分类,就如同最上层Activity这么一个分类
弊:shared preferences可以被用户手动清除,这种情况你是无法知道的,这会让你的系统出问题。
弊:如上的函数并不会一直被调用,所以得不到一个真实的状态。如果一个app崩溃了,其不会调用onStop()函数。你可以通过定义一个默认的异常处理机制来弥补这个问题,并把状态设定成false。可能还有更多的情况我们未控制,但也有其他觉得方法。
结论
我们更喜欢使用shared preferences。其有最可靠的状态信息,
可以减少app被销毁带来的问题,不需要更多的权限,当我们的Activity在最上层是他给我们更多的决定权,去做一些事情。
异常处理
在上述几个章节提到的错误处理问题,你可以通过创建一个默认的异常处理机制来处理,你可以把这段函数放在onCreate()的最前面
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable throwable) { // fix our issues for static variables isActive = false; // fix our issues for sharedpreferences SharedPreferences sp = getSharedPreferences("OURINFO", MODE_PRIVATE); Editor ed = sp.edit(); ed.putBoolean("active", false); ed.commit(); // Handle everthing else defaultHandler.uncaughtException(thread, throwable); } });
相关推荐
Android判断栈顶activity;打印当前最顶层的activity类名;采用服务后台运行获取当前activity类名;是一个demo App,使用Android studio工具打开,有需要的可以自行下载;
浅谈Android的Activity运行流程(生命周期)
android实现activity后台运行.docx
下面小编就为大家分享一篇Android 判断某个Activity 是否在前台运行的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
鉴于有时需要Activity在后台运行,该文档提供了Activity后台运行的方法
本文实例讲述了android获取当前运行Activity名字的方法,可以避免即时聊天再出现通知的情况。分享给大家供大家参考。具体方法如下: 最近在做IM时需要知道当前Activity是哪一个Activity.自己整理一下两种方法 第一种...
native activity实例,导入eclipse可以直接运行。 原作者地址:http://blog.csdn.net/panda1234lee/article/details/10943707
Android Activity设置相同的action进行判断源码、比赛练习案例,学习实例,开箱即用。适用于实际项目开发参考、教学案例、毕业...Android Activity设置相同的action进行判断源码选好版本SDK版本,直接可以运行看效果
在大部份情况下,每个Android应用都将运行在自己的Linux进程当中。当这个应用的某些代码需要执行时,进程就会被创建,并且将保持运行,直到该进程不再需要,而系统需要释放它所占用的内存,为其他应用所用时,才停止...
在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。
在Android设备中,按Back键会将当前的Activity出栈销毁,而按HOME键却会将之隐藏到后台。如若有多个这样的程序这样操作,我们不知道后台到底有多少个正在运行的应用程序。此程序的目的就列举出后台正在运行的应用...
该资源包含了一个activity访问另一个应用的acitvity的简单实现,简单易懂,喜欢的下载!
但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运行时的屏幕方向。还有就是在我们用手机观看视频时,随意的进行横竖屏切换,但播放进度不会随着屏幕的转换而从头开始播放...
一个开机自动启动的ActivityDemo,4.0完美运行
Package 包。只是在我们的app中这个Package是唯一的,就像你...Android中,activity是所有程序的根本,所有程序的流程都运行在activity之中,activity可以算是开发者遇到的最频繁,也是android当中最基本的模块之一。
免费资源可以看博客中《Activity之间的数据回传》进行学习 Android开发 猴子摘桃小项目——学习Activity之间的数据回传
高通LA.1.1基线Android内核系统开发-管理 Activity和组件运行状态 的系统进程----ActivityManagerServer(AMS)启动流程分析。该版本为Android 10 ,AMS的启动流程与旧版的不同。详细看文档内容。
实验一 第一个Android程序和Activity生命周期。实验要求: 1.用工程向导生成第一个Android程序,并在模拟器上运行 注意在新建应用的选择SDK版本时选API 18 2.熟悉Android应用程序的基本文件结构 3.了解使用开发环境...