欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发判断一个app应用是否在运行的方法详解

程序员文章站 2022-06-29 08:45:44
本文实例讲述了android开发判断一个app应用是否在运行的方法。分享给大家供大家参考,具体如下: 在一个应用中,或一个service 、receiver中有时候需要判...

本文实例讲述了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程序设计有所帮助。