Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近期任务)与正在运行的程序
2017-06-16 17:02
671 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
在Android里,app和process和task是三个不同的概念.
process是一个继承自Linux的概念,一般一个app会有一个uid,一般会独立地开一个process。
但是,也会有多个app共享一个process或者uid的,这个可以自己指定。
task是一个activity的栈,其中"可能"含有来自多个App(不一定在同一process中)中的activity。
ActivityManager类可以获取运行信息,如下:
getRecentTasks() 最近开的task,HOME键长按会看到这个
getRunningAppProcesses() 运行中的作为app容器的process
getRunningServices() 运行中的后台服务
getRunningTasks() 运行中的任务
如果一个Activity “mainActivity”不是作为task的root activity打开的,而是被别的Task中Activity调用,那么mainActivity对应的process是开着的,这时我们是否要显示它呢?
另外,如果一个app只有service开着而在Task中不存在这个app的Activity,算不算开着呢?
所以要根据我们的项目需求进行不同的处理,现在贴出两个常用的方法:
1.获取正在运行的进程列表:
[java] view
plain copy
/**
* 获取正在运行的程序信息
* @param context
* @return
*/
public static List<Programe> getRunningProcess(Context context){
PackagesInfo pi = PackagesInfo.getInstance(context);
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
PackageManager pm =context.getPackageManager();
List<Programe> list = new ArrayList<Programe>();
Programe pr = new Programe();
try {
for(RunningAppProcessInfo ra : run){
if(ra.processName.equals("system") || ra.processName.equals("com.Android.phone")){ //可以根据需要屏蔽掉一些进程
continue;
}
pr = new Programe();
pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
Log.v("tag","icon = " + pr.getIcon() +"name=" + pr.getName());
list.add(pr);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
2. 获取最近运行的程序列表(近期任务),长按home键所示效果:
[java] view
plain copy
public static String getTaskList(Context context) {
ImageButton ivIcon;
String apps = "";
ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
PackageManager pm = context.getPackageManager();
try {
List<RecentTaskInfo> list = am.getRecentTasks(64, 0);
for (RecentTaskInfo ti : list) {
Intent intent = ti.baseIntent;
ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
if (resolveInfo != null) {
ivIcon = new ImageButton(context);
ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));
ivIcon.setFocusable(true);
ivIcon.setClickable(true);
ivIcon.setEnabled(true);
ivIcon.setScaleType(ScaleType.CENTER);
ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));
apps = apps.equals("")?resolveInfo.loadLabel(pm)+"":apps+","+resolveInfo.loadLabel(pm);
}
}
return apps;
} catch (SecurityException se) {
se.printStackTrace();
return apps;
}
}
3.判断程序是否是栈顶程序
[java] view
plain copy
/**
* 判断当前程序是否在栈顶
* @param packageName
* @param context
* @return
*/
public static boolean isTopActivy(String packageName, Context context)
{
ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
String currentPackageName = cn.getPackageName();
return (currentPackageName != null && currentPackageName.equals(packageName));
}
参考:
http://blog.csdn.net/Yao_GUET/article/details/6267943
在Android里,app和process和task是三个不同的概念.
process是一个继承自Linux的概念,一般一个app会有一个uid,一般会独立地开一个process。
但是,也会有多个app共享一个process或者uid的,这个可以自己指定。
task是一个activity的栈,其中"可能"含有来自多个App(不一定在同一process中)中的activity。
ActivityManager类可以获取运行信息,如下:
getRecentTasks() 最近开的task,HOME键长按会看到这个
getRunningAppProcesses() 运行中的作为app容器的process
getRunningServices() 运行中的后台服务
getRunningTasks() 运行中的任务
如果一个Activity “mainActivity”不是作为task的root activity打开的,而是被别的Task中Activity调用,那么mainActivity对应的process是开着的,这时我们是否要显示它呢?
另外,如果一个app只有service开着而在Task中不存在这个app的Activity,算不算开着呢?
所以要根据我们的项目需求进行不同的处理,现在贴出两个常用的方法:
1.获取正在运行的进程列表:
[java] view
plain copy
/**
* 获取正在运行的程序信息
* @param context
* @return
*/
public static List<Programe> getRunningProcess(Context context){
PackagesInfo pi = PackagesInfo.getInstance(context);
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
PackageManager pm =context.getPackageManager();
List<Programe> list = new ArrayList<Programe>();
Programe pr = new Programe();
try {
for(RunningAppProcessInfo ra : run){
if(ra.processName.equals("system") || ra.processName.equals("com.Android.phone")){ //可以根据需要屏蔽掉一些进程
continue;
}
pr = new Programe();
pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
Log.v("tag","icon = " + pr.getIcon() +"name=" + pr.getName());
list.add(pr);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
2. 获取最近运行的程序列表(近期任务),长按home键所示效果:
[java] view
plain copy
public static String getTaskList(Context context) {
ImageButton ivIcon;
String apps = "";
ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
PackageManager pm = context.getPackageManager();
try {
List<RecentTaskInfo> list = am.getRecentTasks(64, 0);
for (RecentTaskInfo ti : list) {
Intent intent = ti.baseIntent;
ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
if (resolveInfo != null) {
ivIcon = new ImageButton(context);
ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));
ivIcon.setFocusable(true);
ivIcon.setClickable(true);
ivIcon.setEnabled(true);
ivIcon.setScaleType(ScaleType.CENTER);
ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));
apps = apps.equals("")?resolveInfo.loadLabel(pm)+"":apps+","+resolveInfo.loadLabel(pm);
}
}
return apps;
} catch (SecurityException se) {
se.printStackTrace();
return apps;
}
}
3.判断程序是否是栈顶程序
[java] view
plain copy
/**
* 判断当前程序是否在栈顶
* @param packageName
* @param context
* @return
*/
public static boolean isTopActivy(String packageName, Context context)
{
ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
String currentPackageName = cn.getPackageName();
return (currentPackageName != null && currentPackageName.equals(packageName));
}
参考:
http://blog.csdn.net/Yao_GUET/article/details/6267943
相关文章推荐
- Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近期任务)与正在运行的程序
- Android:分析app、Process、Task之间的区别,以及获取最近运行的程序(近期任务)与正在运行的程序
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程
- Android TASK 和 PROCESS的区别,获取最近运行的程序和正在运行的进程
- android应用完全退出,并且从最近运行程序以及系统正在运行列表中完全抹除。
- Android高手之路之获取正在运行的service,以及判断某个service是否正在运行
- 获取Android正在运行的任务和服务
- 获取Android正在运行的任务和服务
- 获取Android正在运行的任务和服务
- Android 获取正在运行的任务和服务
- Android程序运行且退出后却不会显示在近期任务里
- 获取Android正在运行的任务和服务
- 获取Android正在运行的任务和服务
- android长按home键源码分析以及模拟长按home事件--弹出近期任务
- 【总结备用】Android 获取正在运行的任务和服务
- android长按home键源码分析以及模拟长按home事件--弹出近期任务.