Android开发判断一个app应用是否在运行的方法详解
本文实例讲述了android开发判断一个app应用是否在运行的方法。分享给大家供大家参考,具体如下:
在一个应用中,或一个service 、receiver中有时候需要判断一个应用是否正在运行,以便进行一些相关的处理,这个时候我们需要得到一个activitymanager,这个manager顾名思意就是管理activity的,它有一个方法叫getrunningtasks,可以得到当前系统正在运行的task的列表,代码如下:
activitymanager am = (activitymanager)context.getsystemservice(context.activity_service); list<runningtaskinfo> list = am.getrunningtasks(100); for (runningtaskinfo info : list) { if (info.topactivity.getpackagename().equals(my_pkg_name) && info.baseactivity.getpackagename().equals(my_pkg_name)) { isapprunning = true; //find it, break break; } }
100表示取的最大的任务数,info.topactivity
表示当前正在运行的activity,info.baseactivity
表系统后台有此 进程在运行,具体要做如何判断就看自已的业务需求。这个类还有更多的方法可以取得系统运行的服务、内存使用情况等的方法,请各位自行查找。
有一点要注意,如果想正常运行此方法,请在你的 androidmanifest.xml 中加入:
<uses-permission android:name="android.permission.get_tasks" />
关于androidmanifest权限控制详细内容可参考android manifest功能与权限描述大全
/** * 判断应用是否在运行 * @param context * @return */ public boolean isrun(context context){ activitymanager am = (activitymanager)context.getsystemservice(context.activity_service); list<runningtaskinfo> list = am.getrunningtasks(100); boolean isapprunning = false; string my_pkg_name = "com.ad"; //100表示取的最大的任务数,info.topactivity表示当前正在运行的activity,info.baseactivity表系统后台有此进程在运行 for (runningtaskinfo info : list) { if (info.topactivity.getpackagename().equals(my_pkg_name) || info.baseactivity.getpackagename().equals(my_pkg_name)) { isapprunning = true; log.i("activityservice isrun()",info.topactivity.getpackagename() + " info.baseactivity.getpackagename()="+info.baseactivity.getpackagename()); break; } } log.i("activityservice isrun()", "com.ad 程序 ...isapprunning......"+isapprunning); return isapprunning; }
android系统内部状态信息的相关api:
得到activitymanager :
activitymanager activitymanager = (activitymanager)this.getsystemservice(activity_service) configurationinfo configurationinfo = activitymanager.getdeviceconfigurationinfo();
获取进程内存状态的信息:
debug.memoryinfo[] processmemoryinfo = activitymanager.getprocessmemoryinfo(processids)
获取当前运行的service信息:
list<runningserviceinfo> runningserviceinfos = activitymanager.getrunningservices(maxvalue);
获取当前运行的任务信息:
list<runningtaskinfo> runningtaskinfos = activitymanager.getrunningtasks(maxvalue);
其中runningtaskinfos 的 topactivity就是当前task的活跃activity 在getrunningtasks()
所返回的task队列中系统会根据这些task的活跃度有一个排序,越活跃越是靠前。第一个就是当前活动的task
/** * 检测某activityupdate是否在当前task的栈顶 */ public boolean istopactivy(string cmdname){ activitymanager manager = (activitymanager) context.getsystemservice(activity_service); list<runningtaskinfo> runningtaskinfos = manager.getrunningtasks(1); string cmpnametemp = null; if(null != runningtaskinfos){ cmpnametemp=(runningtaskinfos.get(0).topactivity).tostring); log.e("cmpname","cmpname:"+cmpname); } if(null == cmpnametemp)return false; return cmpnametemp.equals(cmdname); }
/**get the launcher status */ private boolean islauncherrunnig(context context) { boolean result = false ; list<string> names = getallthelauncher(); activitymanager mactivitymanager = (activitymanager) context.getsystemservice(context.activity_service) ; list<activitymanager.runningappprocessinfo> applist = mactivitymanager.getrunningappprocesses() ; for (runningappprocessinfo running : applist) { if (running.importance == runningappprocessinfo.importance_foreground) { for (int i = 0; i < names.size(); i++) { if (names.get(i).equals(running.processname)) { result = true ; break; } } } } return result ; }
/** * 得到所有的launcher */ private list<string> getallthelauncher(){ list<string> names = null; packagemanager pkgmgt = this.getpackagemanager(); intent it = new intent(intent.action_main); it.addcategory(intent.category_home); list<resolveinfo> ra =pkgmgt.queryintentactivities(it,0); if(ra.size() != 0){ names = new arraylist<string>(); } for(int i=0;i< ra.size();i++) { string packagename = ra.get(i).activityinfo.packagename; names.add(packagename); } return names; }
android 取当前显示的activity :
activitymanager am = (activitymanager) getsystemservice(activity_service); componentname cn = am.getrunningtasks(1).get(0).topactivity; log.d("", "pkg:"+cn.getpackagename()); log.d("", "cls:"+cn.getclassname());
android如何判断程序是否在前台运行:
private boolean istopactivity(){ list<runningtaskinfo> tasksinfo = activitymanager.getrunningtasks(1); if(tasksinfo.size() > 0){ //应用程序位于堆栈的顶层 if(packagename.equals(tasksinfo.get(0).topactivity.getpackagename())){ return true; } } return false; }
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
上一篇: 羊奶能丰胸吗,怎么喝才能发挥它的最大功效
下一篇: JPA的多表复杂查询