当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发判断一个app应用是否在运行的方法详解

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了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权限控制详细内容可参考

/**
* 判断应用是否在运行
* @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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网