和软件管理有一些类似
布局,和APPmanage基本差不多,复制过来改一下即可
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="60dp"
android:text="进程管理"
android:background="#00FF00"
android:gravity="center"
android:textSize="25sp"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_processmanage_num"
android:text="当前手机进程数 \n10个"
android:gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp">
</TextView>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_processmanage_ram"
android:text="可用ram/总ram\n 502M/504M"
android:gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp">
</TextView>
</LinearLayout>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_appmanage_appinfolist"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#798091"
android:textColor="#FFFFFF"
android:textSize="15sp"
android:id="@+id/tv_appmanage_class"/>
</FrameLayout>
</LinearLayout>
activity
<pre name="code" class="java">public class ProcessManagementActivity extends Activity {
private TextView tv_processmanage_num;
private TextView tv_processmanage_ram;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_processmanage);
tv_processmanage_num = (TextView) findViewById(R.id.tv_processmanage_num);
tv_processmanage_ram = (TextView) findViewById(R.id.tv_processmanage_ram);
}
}
home的跳转
case 3 :
Intent intent3 = new Intent(HomeActivity.this, ProcessManagementActivity.class);
startActivity(intent3);
break;
manifest声明
<activity android:name=".ProcessManagementActivity" ></activity>
utils下工具类走起 GetProcessInfoUtils
获取当前正在运行进程个数
public class GetProcessInfoUtils {
//获取当前所有进程
public static int getAllProcess(Context ctx){
int count = -1;
//获取count的个数
ActivityManager ams = (ActivityManager)ctx.getSystemService(ctx.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> rap = ams.getRunningAppProcesses();
count = rap.size();
return count;
}
}
回ProcessManagementActivity设置
tv_processmanage_num = (TextView) findViewById(R.id.tv_processmanage_num);
tv_processmanage_ram = (TextView) findViewById(R.id.tv_processmanage_ram);
//获取一些进程数
int count = GetProcessInfoUtils.getAllProcess(this);
tv_processmanage_num.setText("当前手机的进程数为\n"+count);
}
获取内存容量
工具
public static long getAvailRam(Context ctx){
ActivityManager ams = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo(); //空白的memoinfo 类
ams.getMemoryInfo(outInfo );
return outInfo.availMem;//当前的可用ram 返回的是byte单位
}
public static long getTotalRam(Context ctx){
ActivityManager ams = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo(); //空白的memoinfo 类
ams.getMemoryInfo(outInfo );
return outInfo.totalMem;
}
activity里获取并显示,注意字节转化下
availram = GetProcessInfoUtils.getAvailRam(this);
totalram = GetProcessInfoUtils.getTotalRam(this);
tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+formatSize(totalram)+"MB");
}
private String formatSize(long size) {
return Formatter.formatFileSize(this, size);
}
这里有一些版本的问题,api要大于16才行
用别的方法去获取容量大小,系统有文件存了相关信息,可以去获取,按行存的,这里就需要能用按行读的,bufferreader
需要提取其中的数字
//不应该在内部声明,如果出了异常,内部声明有可能会出现随机值,类似于野指针
long totalram =-1;
File file = new File("/proc/meminfo");
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String firstline= br.readLine();
//把字符拿出来
char[] ch = firstline.toCharArray();
StringBuffer sb = new StringBuffer();
//只要其中的数字,加到一个string中
for (char c : ch) {
if (c>='0'&&c<='9') {
sb.append(c);
}
}
//由于是kb,保险起见,存为long,防止溢出
totalram = Long.parseLong(sb.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return totalram;
}
这时候再activity里不能用format了,因为他传的是byte
tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+totalram/1024+"MB");
OK
在工具类里获得应用列表,需要一个bean
public class ProcessInfo {
private String name ;
private Drawable icon ;
private boolean is_user;
private long memory_usage;
private String packagename ;
private boolean ischecked;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public boolean isIs_user() {
return is_user;
}
public void setIs_user(boolean is_user) {
this.is_user = is_user;
}
public long getMemory_usage() {
return memory_usage;
}
public void setMemory_usage(long memory_usage) {
this.memory_usage = memory_usage;
}
public String getPackagename() {
return packagename;
}
public void setPackagename(String packagename) {
this.packagename = packagename;
}
@Override
public String toString() {
return "ProcessInfo [name=" + name + ", icon=" + icon + ", is_user="
+ is_user + ", memory_usage=" + memory_usage + ", packagename="
+ packagename + "]";
}
public ProcessInfo(String name, Drawable icon, boolean is_user,
long memory_usage, String packagename) {
super();
this.name = name;
this.icon = icon;
this.is_user = is_user;
this.memory_usage = memory_usage;
this.packagename = packagename;
this.ischecked =false;
}
public boolean isIschecked() {
return ischecked;
}
public void setIschecked(boolean ischecked) {
this.ischecked = ischecked;
}
}
public static List<ProcessInfo> getAllProcessInfos(Context ctx){
boolean is_user =false;
String appname ="";
Drawable icon = null;
long memory_usage=0;
List<ProcessInfo> processinfos = new ArrayList<ProcessInfo>();
ActivityManager ams = (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> rap = ams.getRunningAppProcesses();
//拿到包管理器
PackageManager pm = ctx.getPackageManager();
//遍历以获取各个字段,动态的,运行起来的程序
for (RunningAppProcessInfo runningAppProcessInfo : rap) {
String packagename =runningAppProcessInfo.processName;
//最后单独获取pid对应的ram
int[] pids = new int[]{ runningAppProcessInfo.pid};
android.os.Debug.MemoryInfo[] processMemoryInfo = ams.getProcessMemoryInfo(pids);
memory_usage = processMemoryInfo[0].getTotalPss(); //返回值单位是Kb
try {
ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename,0);
appname = applicationInfo.loadLabel(pm).toString();
icon = applicationInfo.loadIcon(pm);
if ((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0) {
is_user =false;
}else {
is_user =true;
}
//信息添加进去
ProcessInfo pinfo = new ProcessInfo(appname, icon, is_user, memory_usage, packagename);
processinfos.add(pinfo);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return processinfos;
}
测试类
public class ProcessinfoListTest extends AndroidTestCase{
public void testProcessinfoList(){
List<ProcessInfo> list = GetProcessInfoUtils.getAllProcessInfos(getContext());
for(ProcessInfo processInfo : list){
System.out.println("test"+processInfo);
}
}
}
没问题,显示list
异步线程,他还需要一个adapter,直接复制app管理里的,稍微改一下
private void refreshData() {
new MyAsyncTask() {
@Override
public void pretast() {
// TODO Auto-generated method stub
}
@Override
public void posttast() {
if (adapter==null) {
adapter = new MyAdapter();
lv_procmanage_procinfolist.setAdapter(adapter);
}
else {
adapter.notifyDataSetChanged();
}
}
@Override
public void intask() {
// TODO Auto-generated method stub
//耗时操作,放在子线程
//appinfolist = Getp.getAppInfos(AppManagementActivity.this);
processinfolist = GetProcessInfoUtils.getAllProcessInfos(ProcessManagementActivity.this);
for (ProcessInfo procInfo : processinfolist) {
if (procInfo.isIs_user()) {
user_proinfolist.add(procInfo);
}
else {
sys_proinfolist.add(procInfo);
}
}
}
}.execute();;
}
需要一个新的layout item_procmanager_procinfo
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/iv_procmanage_icon"
android:src="@drawable/app"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_procmanage_icon"
android:id="@+id/tv_procmanage_appname"
android:textSize="20sp"
android:layout_marginTop="5dp"
android:text="我的app"
android:textColor="#000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_procmanage_icon"
android:layout_below="@id/tv_procmanage_appname"
android:id="@+id/tv_procmanage_memory"
android:textSize="16sp"
android:text="sd卡"
android:textColor="#0000FF"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/cb_procmanage_check"
android:layout_alignParentRight="true"
android:focusable="false"
android:clickable="false"
android:layout_marginTop="18dp"
android:layout_marginRight="10dp">
</CheckBox>
</RelativeLayout>
一些列的声明
private MyAdapter adapter;
private ListView lv_procmanage_procinfolist;
private List<ProcessInfo> processinfolist;
private List<ProcessInfo> user_proinfolist;
private List<ProcessInfo> sys_proinfolist;
private boolean show_sysproc;
private int listcount =0;
private int deletecount =0;
<pre name="code" class="java">lv_procmanage_procinfolist = (ListView) findViewById(R.id.lv_procmanage_appinfolist);
user_proinfolist = new ArrayList<ProcessInfo>();
sys_proinfolist= new ArrayList<ProcessInfo>();
//获取一些进程数
int count = GetProcessInfoUtils.getAllProcess(this);
class MyAdapter extends BaseAdapter{
private Holder holder;
@Override
public int getCount() {
// TODO Auto-generated method stub
if (show_sysproc) {
listcount = processinfolist.size()+2;
}else {
listcount= user_proinfolist.size()+1;
}
return listcount-deletecount;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//AppInfo appInfo = appinfolist.get(position);
if (position ==0) {
TextView tv = new TextView(ProcessManagementActivity.this);
tv.setText("用户进程("+user_proinfolist.size()+")个");
tv.setBackgroundColor(Color.GRAY);
tv.setTextColor(Color.WHITE);
tv.setTextSize(15);
return tv ;
}else if (position==user_proinfolist.size()+1) {
TextView tv = new TextView(ProcessManagementActivity.this);
tv.setText("系统进程("+sys_proinfolist.size()+")个");
tv.setBackgroundColor(Color.GRAY);
tv.setTextColor(Color.WHITE);
tv.setTextSize(15);
return tv ;
}
ProcessInfo procInfo;
if (position< user_proinfolist.size()+1) {
procInfo = user_proinfolist.get(position-1);
}else {
/*if (sys_proinfolist.size()==0) {
return null;
}*/
procInfo = sys_proinfolist.get(position-user_proinfolist.size()-2);
}
View item_layout =null;
if (convertView!=null && convertView instanceof RelativeLayout ) {
item_layout =convertView;
holder = (Holder) item_layout.getTag();
}else {
item_layout = View.inflate(getApplicationContext(), R.layout.item_procmanager_procinfo, null);
holder = new Holder();
holder.iv_procmanage_icon = (ImageView) item_layout.findViewById(R.id.iv_procmanage_icon);
holder.tv_procmanage_appname = (TextView) item_layout.findViewById(R.id.tv_procmanage_appname);
holder.tv_procmanage_memory = (TextView) item_layout.findViewById(R.id.tv_procmanage_memory);
holder.cb_procmanage_check = (CheckBox) item_layout.findViewById(R.id.cb_procmanage_check);
item_layout.setTag(holder);
}
if (procInfo.getIcon()!=null) {
holder.iv_procmanage_icon.setImageDrawable(procInfo.getIcon());
}
else
{
holder.iv_procmanage_icon.setImageResource(R.drawable.processicon);
}
holder.tv_procmanage_appname.setText(procInfo.getName());
holder.tv_procmanage_memory.setText(procInfo.getMemory_usage()/1024+"MB");
holder.cb_procmanage_check.setChecked(procInfo.isIschecked());
return item_layout;
}
class Holder {
ImageView iv_procmanage_icon ;
TextView tv_procmanage_appname;
TextView tv_procmanage_memory ;
CheckBox cb_procmanage_check;
}
}
oncreate里需要调用一次refresh
tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+totalram/1024+"MB");
refreshData();
}
private String formatSize(long size) {