main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="vertical" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="50dip"
android:layout_marginLeft="10dip"
android:orientation="horizontal" > <TextView
android:layout_width="120dip"
android:layout_height="wrap_content"
android:text="系统可用内存为:" /> <TextView
android:id="@+id/tvAvailMemory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFD700" />
</LinearLayout> <Button
android:id="@+id/btProcessInfo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查看系统进程信息" /> </LinearLayout>

browse_process_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvTotalProcessNo"
android:layout_width="fill_parent"
android:layout_height="30dip"
android:textSize="20sp" />
<ListView
android:id="@+id/listviewProcess"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dip" /> </LinearLayout>

browse_process_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="80dip"
android:orientation="vertical" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:text="进程ID : " />
<TextView
android:id="@+id/tvProcessPID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dip"
android:textColor="#FFD700" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:text="进程所在UID:" />
<TextView
android:id="@+id/tvProcessUID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFD700" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:text="进程占用内存:" />
<TextView
android:id="@+id/tvProcessMemSize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFD700" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="horizontal" >
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:text="进程名:" />
<TextView
android:id="@+id/tvProcessName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFD700" />
</LinearLayout> </LinearLayout>

ProcessInfo.java

package com.qin.ammp;

//Model类
public class ProcessInfo { // 进程id Android规定android.system.uid=1000
private int pid;
// 进程所在的用户id ,即该进程是有谁启动的 root/普通用户等
private int uid;
// 进程占用的内存大小,单位为kb
private int memSize;
// 进程名
private String processName; public ProcessInfo(){} public int getPid() {
return pid;
} public void setPid(int pid) {
this.pid = pid;
} public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public int getMemSize() {
return memSize;
} public void setMemSize(int memSize) {
this.memSize = memSize;
} public String getProcessName() {
return processName;
} public void setPocessName(String processName) {
this.processName = processName;
} }

MainActivity.java

package com.qin.ammp;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity { private static String TAG = "AM_MEMORYIPROCESS" ; private ActivityManager mActivityManager = null ; private TextView tvAvailMem ;
private Button btProcessInfo ; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); tvAvailMem = (TextView)findViewById(R.id.tvAvailMemory) ;
btProcessInfo =(Button)findViewById(R.id.btProcessInfo);
//跳转到显示进程信息界面
btProcessInfo.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,BrowseProcessInfoActivity.class);
startActivity(intent);
}
}); //获得ActivityManager服务的对象
mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); //获得可用内存信息
String availMemStr = getSystemAvaialbeMemorySize();
Log.i(TAG, "The Availabel Memory Size is"+availMemStr);
//显示
tvAvailMem.setText(availMemStr); }
//获得系统可用内存信息
private String getSystemAvaialbeMemorySize(){
//获得MemoryInfo对象
MemoryInfo memoryInfo = new MemoryInfo() ;
//获得系统可用内存,保存在MemoryInfo对象上
mActivityManager.getMemoryInfo(memoryInfo) ;
long memSize = memoryInfo.availMem ; //字符类型转换
String availMemStr = formateFileSize(memSize); return availMemStr ;
} //调用系统函数,字符串转换 long -String KB/MB
private String formateFileSize(long size){
return Formatter.formatFileSize(MainActivity.this, size);
} }

BrowseProcessInfoActivity.java

package com.qin.ammp;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Debug;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener; public class BrowseProcessInfoActivity extends Activity implements OnItemClickListener{ private static String TAG = "ProcessInfo";
private static final int KILL_PORCESS = 1;
private static final int SEARCH_RUNNING_APP = 2; private ActivityManager mActivityManager = null;
// ProcessInfo Model类 用来保存所有进程信息
private List<ProcessInfo> processInfoList = null; private ListView listviewProcess;
private TextView tvTotalProcessNo ; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.browse_process_list); listviewProcess = (ListView) findViewById(R.id.listviewProcess);
listviewProcess.setOnItemClickListener(this); tvTotalProcessNo =(TextView)findViewById(R.id.tvTotalProcessNo); this.registerForContextMenu(listviewProcess);
// 获得ActivityManager服务的对象
mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 获得系统进程信息
getRunningAppProcessInfo();
// 为ListView构建适配器对象
BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
this, processInfoList);
listviewProcess.setAdapter(mprocessInfoAdapter); tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size());
}
//杀死该进程,并且刷新
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, final int position, long arg3) {
// TODO Auto-generated method stub
new AlertDialog.Builder(this).setMessage("是否杀死该进程")
.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//杀死该进程,释放进程占用的空间
mActivityManager.killBackgroundProcesses(processInfoList.get(position).getProcessName());
//刷新界面
getRunningAppProcessInfo() ;
BrowseProcessInfoAdapter mprocessInfoAdapter = new BrowseProcessInfoAdapter(
BrowseProcessInfoActivity.this, processInfoList);
listviewProcess.setAdapter(mprocessInfoAdapter);
tvTotalProcessNo.setText("当前系统进程共有:"+processInfoList.size()); }
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel() ;
}
}).create().show() ;
} /**
* 获得系统进程信息
*/
private void getRunningAppProcessInfo() {
// ProcessInfo Model类 用来保存所有进程信息
processInfoList = new ArrayList<ProcessInfo>(); // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager
.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
// 进程ID号
int pid = appProcessInfo.pid;
// 用户ID 类似于Linux的权限不同,ID也就不同 比如 root等
int uid = appProcessInfo.uid;
// 进程名,默认是包名或者由属性android:process=""指定
String processName = appProcessInfo.processName;
// 获得该进程占用的内存
int[] myMempid = new int[] { pid };
// 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息
Debug.MemoryInfo[] memoryInfo = mActivityManager
.getProcessMemoryInfo(myMempid);
// 获取进程占内存用信息 kb单位
int memSize = memoryInfo[0].dalvikPrivateDirty; Log.i(TAG, "processName: " + processName + " pid: " + pid
+ " uid:" + uid + " memorySize is -->" + memSize + "kb");
// 构造一个ProcessInfo对象
ProcessInfo processInfo = new ProcessInfo();
processInfo.setPid(pid);
processInfo.setUid(uid);
processInfo.setMemSize(memSize);
processInfo.setPocessName(processName);
processInfoList.add(processInfo); // 获得每个进程里运行的应用程序(包),即每个应用程序的包名
String[] packageList = appProcessInfo.pkgList;
Log.i(TAG, "process id is " + pid + "has " + packageList.length);
for (String pkg : packageList) {
Log.i(TAG, "packageName " + pkg + " in process id is -->"
+ pid);
}
}
} public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, 0, KILL_PORCESS, "杀死该进程");
menu.add(0, 0, SEARCH_RUNNING_APP, "运行在该进程的应用程序");
super.onCreateContextMenu(menu, v, menuInfo); } public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case KILL_PORCESS: // 杀死该进程 , 重新加载界面
new AlertDialog.Builder(this).setMessage("是否杀死该进程")
.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel() ;
}
}).create().show() ;
break;
case SEARCH_RUNNING_APP: // 查看运行在该进程的应用程序信息
break;
default:
break;
}
return super.onContextItemSelected(item);
} }

BrowseProcessInfoAdapter.java

package com.qin.ammp;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; //自定义适配器类,提供给listView的自定义view
public class BrowseProcessInfoAdapter extends BaseAdapter { private List<ProcessInfo> mlistProcessInfo = null; LayoutInflater infater = null; public BrowseProcessInfoAdapter(Context context, List<ProcessInfo> apps) {
infater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mlistProcessInfo = apps ;
}
@Override
public int getCount() {
System.out.println("size" + mlistProcessInfo.size());
return mlistProcessInfo.size();
}
@Override
public Object getItem(int position) {
return mlistProcessInfo.get(position);
} @Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertview, ViewGroup arg2) {
System.out.println("getView at " + position);
View view = null;
ViewHolder holder = null;
if (convertview == null || convertview.getTag() == null) {
view = infater.inflate(R.layout.browse_process_item, null);
holder = new ViewHolder(view);
view.setTag(holder);
}
else{
view = convertview ;
holder = (ViewHolder) convertview.getTag() ;
}
ProcessInfo processInfo = (ProcessInfo) getItem(position);
holder.tvPID.setText(processInfo.getPid() +"");
holder.tvUID.setText(processInfo.getUid() +"") ;
holder.tvProcessMemSize.setText(processInfo.getMemSize()+"KB");
holder.tvProcessName.setText(processInfo.getProcessName()); return view;
} class ViewHolder {
TextView tvPID ; //进程ID
TextView tvUID ; //用户ID
TextView tvProcessMemSize ; //进程占用内存大小
TextView tvProcessName ; // 进程名
public ViewHolder(View view) {
this.tvPID = (TextView)view.findViewById(R.id.tvProcessPID) ;
this.tvUID = (TextView) view.findViewById(R.id.tvProcessUID);
this.tvProcessMemSize = (TextView) view.findViewById(R.id.tvProcessMemSize);
this.tvProcessName = (TextView)view.findViewById(R.id.tvProcessName) ;
}
} }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.qin.ammp"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".BrowseProcessInfoActivity"></activity>
</application> <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> </manifest>

显示所有APP的进程详细信息(进程ID、进程所在UID、进程占用内存、进程名)的更多相关文章

  1. Linux 查找指定名称的进程并显示进程详细信息

    实际应用中可能有这样的场景:给定一个进程名称特征串,查找所有匹配该进程名称的进程的详细信息. 解决的办法是: (1) 先用pgrep [str] 命令进行模糊匹配,找到匹配该特征串的进程ID: (2) ...

  2. linux下查看运行进程详细信息

    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等.这时,我们需要通过以下的方法来查看进程的详细信息: Linux在启动一个进程时,系统会在/proc下创建一个 ...

  3. linux 查看运行进程详细信息

    Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息 通过ll或ls –l命令即可查看. ll /proc/PID cwd符号链接的是进程运行 ...

  4. linux根据进程pid查看进程详细信息

    http://note.youdao.com/noteshare?id=af2fdd34e3adfacda2d34706e16e5045

  5. Display a Detail View with a List View 主子视图-列表视图与详细信息视图同时显示

    In this lesson, you will learn how to display a Detail View together with a List View. For this purp ...

  6. Linux 进程资源用量监控和按用户设置进程限制

    每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...

  7. struts2:上传多个文件时实现带进度条、进度详细信息的示范

    上一篇文章讲了上传单个文件与上传多个文件(属性驱动)的例子.本例是上传多个文件(属性驱动),并且显示进度条.进度详细信息的示范. 在文件上传选择界面,允许用户增加.删除选择的文件,且只能上传指定类型的 ...

  8. 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)

    不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...

  9. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

随机推荐

  1. One simple WPF & C# RayTracer

    What's this 这是一个软渲染光线追踪器,基于c#和wpf技术. How to use 这份代码的唯一参考书是Ray Tracing From The Ground Up,在学习和阅读本书过程 ...

  2. iOS百度地图

    一.百度地图sdk具体使用过程,參考以下的博客(我感觉非常具体.并且有问题能够找楼主.他会给解答,感谢好心人-): 怎样使用百度地图sdk,及相关demo下载 上述博客给的demo,是真机执行的(百度 ...

  3. 自己动手,制作真正的.net Framework 3.5 SP1离线安装包(转)

    .NET Framework 3.5 SP1发布了,兴冲冲…下载,当然是完全离线安装包.net Framework 3.5 Service pack 1(Full Package) 231MB,网络慢 ...

  4. Resources.FindObjectsOfTypeAll<T>()的坑(Ghost prefab)

    今天遇到了一个Bug,因为调用Resources.FindObjectsOfTypeAll<T>()遍历整个场景,结果遍历出的对象不对.比较哈希一查果然是两个.原来prefab本身和pre ...

  5. migrate的使用

    安装完yii2后,需要创建一张user表,这里用migrate创建 1.在dos窗口下,先cd到项目的目录,比如E:\>cd E:\Visual-AMP-x64\www\blog\blog 2. ...

  6. OSGi规范概要

    目前最新的OSGi规范是2012年7月发布的Release 5,Version5.0(后文简称为R5.0)版本,该规范定义了Java模块化系统所涉及的各种场景(开发.打包.部署.更新和交互等),以及其 ...

  7. C# 版 防止 DNS 污染,获取域名真实 IP 地址

    using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net. ...

  8. makefile之foreach函数

    #$(foreach <var>,<list>,<text>) #把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再 ...

  9. 当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B?

    给出答案: 是不能的,其他线程只能访问该对象的非同步方法,同步方法则不能进入; 因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法,说明对象锁已经被取

  10. Oracle面试题目及解答

    这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度. 1. 解释冷备份和热备份的不同 ...