如何获取android正在运行的进程

如何获取android正在运行的进程,第1张

ActivityManagerRunningAppProcessInfo类说明: 封装了正在运行的进程信息常用字段:int pid 进程IDint uid 进程所在的用户IDString processName 进程名,默认是包名或者由android:process=””属性指定String [ ] pkgList 运行在该进程下的所有应用程序包名关于ActivityManagerRunningAppProcessInfo更多信息,请查看<Android中应用程序的信息---ActivityManager的使用>PackageManger类说明: 封装了对应用程序信息的 *** 作获得应用程序信息的的方法如下:public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)参数:packagename 包名flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可功能:返回ApplicationInfo对象

在Android中,Activity有个栈,一个Activity结束掉,会回到上一个Activity,并不是退出应用程序。

Android中,退出应用程序的方式:

1通过pid

int pid = androidosProcessmyPid(); //获取当前应用程序的PID

androidosProcesskillProcess(pid); //杀死当前进程

这种方法退出应用,是会保留某些后进程,例如:Service,Notifications等。

2通过ActivityManager

ActivityManager manager = (ActivityManager)contextgetSystemService(ACTIVITY_SERVICE); //获取应用程序管理器

managerkillBackgroundProcesses(getPackageName()); //强制结束当前应用程序

这种方式退出应用,会结束本应用程序的一切活动,因为本方法会根据应用程序的包名杀死所有进程包括Activity,Service,Notifications等。

 1鼠标右键点击“计算机”(win xp中是‘我的电脑’),选择“管理”(或设备管理器)

2连接手机设备,在设备的一栏点击鼠标右键,选择属性

3选择详细信息,选中任意一项右键,并选择复制。粘贴至文本文档或其他便于记录的地方即可

注意:win xp中不能直接复制该项,此时请对照找到的PID和VID,手动输出

1获取系统的可用内存和总内存。

获取系统内存中应用的信息,需要用到ActivityManager这个类,然而当你用这个类拿数据的时候你会发现,拿到的数据不正确。用这个类的API获取系统的总内存和可用内存会出现数据不正确的情况。除了这个类,Android手机中有文件描述了这些信息——/proc/meminfo。meminfo文件中详细的记录了安卓手机的一些数据,包括可用内存和总内存。附上代码:

public static long getTotalMemSize() {

long size=0;

File file = new File("/proc/meminfo");

try {

BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

String memInfo = bufferreadLine();

int startIndex = memInfoindexOf(":");

int endIndex = memInfoindexOf("k");

memInfo = memInfosubstring(startIndex + 1, endIndex)trim();

size = LongparseLong(memInfo);

size = 1024;

bufferclose();

} catch (javaioIOException e) {

eprintStackTrace();

}

return size;

}

public static long getAviableMemSize() {

long size=0;

File file = new File("/proc/meminfo");

try {

BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

String memInfos=new String();

int i=0;

while ((memInfos=bufferreadLine())!=null){

i++;

if (i==2){

memInfo = memInfos;

}

}

int startIndex = memInfoindexOf(":");

int endIndex = memInfoindexOf("k");

memInfo = memInfosubstring(startIndex + 1, endIndex)trim();

size = LongparseLong(memInfo);

size = 1024;

bufferclose();

} catch (javaioIOException e) {

eprintStackTrace();

}

return size;

}

*** 作很简单分别是读取第一行的数据和第二行的数据,将字符串分去出,将所得值乘以1024变为byte类型。

2获取内存中运行应用的信息

首先,自然要有一个Bean文件用于存储这些信息,之后通过ActivityManager的getRunningAppProcesses()方法得到一个RunningAppProcessInfo的List。便利这个List去除我们想要的数据,存在我们的Bean文件夹中。

public static List<TaskBean> getAllTask() {

List<TaskBean>taskList=new ArrayList<>();

List<ActivityManagerRunningAppProcessInfo>runList=UIUtilsgetActManager()getRunningAppProcesses();

try {

for (ActivityManagerRunningAppProcessInfo r:runList) {

TaskBean taskBean = new TaskBean();

String processName = rprocessName;

taskBeansetPackageName(processName);

PackageInfo packageInfo = UIUtilsgetPacManager()getPackageInfo(processName, 0);

taskBeansetIcon(packageInfoapplicationInfoloadIcon(UIUtilsgetPacManager()));

taskBeansetName(packageInfoapplicationInfoloadLabel(UIUtilsgetPacManager())toString());

DebugMemoryInfo[] processInfo=UIUtilsgetActManager()getProcessMemoryInfo(new int[]{rpid});

taskBeansetMemSize(processInfo[0]getTotalPrivateDirty()1024);

if ((packageInfoapplicationInfoflags&ApplicationInfoFLAG_SYSTEM)!=0){

taskBeansetSystem(true);

}else {

taskBeansetUser(true);

}

if (taskList != null) {

taskListadd(taskBean);

for (int i=0;i<taskListsize();i++) {

if (taskListget(i)getPackageName()equals(ConstantsPACKAGE_INFO)){

taskListremove(i);

}

}

}

}

} catch (PackageManagerNameNotFoundException e) {

eprintStackTrace();

}

return taskList;

}

好了,大功告成。当你开开心心的拿到手机上调试的时候你会发现,一个数据都没有。原来,在Android50之后,谷歌处于完全考虑已经弃用了通过如上方法拿到进程中的信息。那么又应该怎么做呢?

public static List<TaskBean> getTaskInfos() {

List<AndroidAppProcess> processInfos = ProcessManagergetRunningAppProcesses();

List<TaskBean> taskinfos = new ArrayList<TaskBean>();

// 遍历运行的程序,并且获取其中的信息

for (AndroidAppProcess processInfo : processInfos) {

TaskBean taskinfo = new TaskBean();

// 应用程序的包名

String packname = processInfoname;

taskinfosetPackageName(packname);

// 湖区应用程序的内存 信息

androidosDebugMemoryInfo[] memoryInfos = UIUtilsgetActManager()

getProcessMemoryInfo(new int[] { processInfopid });

long memsize = memoryInfos[0]getTotalPrivateDirty() 1024L;

taskinfosetMemSize(memsize);

taskinfosetPackageName(processInfogetPackageName());

try {

// 获取应用程序信息

ApplicationInfo applicationInfo = UIUtilsgetPacManager()getApplicationInfo(

packname, 0);

Drawable icon = applicationInfoloadIcon(UIUtilsgetPacManager());

taskinfosetIcon(icon);

String name = applicationInfoloadLabel(UIUtilsgetPacManager())toString();

taskinfosetName(name);

if ((applicationInfoflags & ApplicationInfoFLAG_SYSTEM) == 0) {

// 用户进程

taskinfosetUser(true);

} else {

// 系统进程

taskinfosetSystem(true);

}

} catch (PackageManagerNameNotFoundException e) {

// TODO Auto-generated catch block

eprintStackTrace();

// 系统内核进程 没有名称

taskinfosetName(packname);

Drawable icon = UIUtilsgetContext()getResources()getDrawable(

Rdrawableic_launcher);

taskinfosetIcon(icon);

}

if (taskinfo != null) {

taskinfosadd(taskinfo);

for (int i=0;i<taskinfossize();i++) {

if (taskinfosget(i)getPackageName()equals(ConstantsPACKAGE_INFO)){

taskinfosremove(i);

}

}

}

}

return taskinfos;

}

好了,接下来只需要判断安装的版本就可以了:

int sysVersion = IntegerparseInt(BuildVERSIONSDK);

taskList = sysVersion > 21 TaskManagerEnginegetTaskInfos() : TaskManagerEnginegetAllTask();

好了,大功告成。数据就能正常拿到了。

以上就是关于如何获取android正在运行的进程全部的内容,包括:如何获取android正在运行的进程、Android 能不能监听到第三方应用App的启动和退出、平板电脑安卓系统怎么查看VID 和 PID 啊 急啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9622108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存