使用ActivityManager实现进程管理
Android中使用ActivityManager可以获得进程信息,并对进程进行管理,如结束进程等。本文使用ActivityManager获得进程列表,并结束选中的进程。
首先,看看布局文件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="5" > <TextView android:id="@+id/textView1" style="@style/my_style" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="3" /> <TextView android:id="@+id/textView2" style="@style/my_style" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_gravity="center_vertical|center_horizontal" android:layout_weight="3" android:gravity="center_vertical|center_horizontal" android:text="进程号" /> <TextView android:id="@+id/textView3" style="@style/my_style" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="2" android:gravity="center_vertical|center_horizontal" android:text="进程名" /> <TextView android:id="@+id/textView4" style="@style/my_style" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="3" android:gravity="center_vertical|center_horizontal" android:text="内存" /> </LinearLayout> <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" > </ListView> <Button android:id="@+id/btn_pro" style="@style/my_style" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="5" android:text="结束" /> </LinearLayout>
然后是Java文件。
package com.hzhi.sysinfor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.ActivityManager; import android.app.AlertDialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Debug; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class process extends ListActivity{ Button btn_stop; PackageManager pkg_man; list_pro list_ada; ActivityManager am; // 获得所有的进程列表 public void get_pro(){ list_ada = new list_pro(this); // 包管理器 am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); // 获取手机内所有应用 List<ActivityManager.RunningAppProcessInfo> pi = am.getRunningAppProcesses(); for (int i=0; i<pi.size(); i++){ ActivityManager.RunningAppProcessInfo pii = (ActivityManager.RunningAppProcessInfo) pi.get(i); int[] mem = new int[] {pii.pid}; Debug.MemoryInfo[] mi = am.getProcessMemoryInfo(mem); list_ada.addItem(String.valueOf(pii.pid), pii.processName, String.valueOf(mi[0].dalvikPrivateDirty) + "KB", false); } setListAdapter(list_ada); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_process); get_pro(); btn_stop = (Button) findViewById(R.id.btn_pro); btn_stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for (int j=0; j<list_ada.list_data.size(); j++){ // 该应用需要删除 if (list_ada.list_data.get(j).is_chk){ String name = (String) list_ada.list_data.get(j).txt_name.getText(); final String pro = (String) list_ada.list_data.get(j).txt_name.getText(); new AlertDialog.Builder(process.this) .setTitle("结束进程") .setMessage("确定结束" + name + "吗?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { unload(pro); get_pro(); } }) .setNegativeButton("否", null) .show(); } } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public boolean unload (String n){ boolean res = true; am.killBackgroundProcesses(n); Toast.makeText(process.this, "进程" + n + "已经结束!", Toast.LENGTH_LONG) .show(); return res; } } // pro列表 class list_pro extends BaseAdapter implements OnClickListener{ public Context ctx; public List<item_pro> list_data; public list_pro(Context context){ ctx = context; list_data = new ArrayList<item_pro>(); } @Override public int getCount() { // TODO Auto-generated method stub return list_data.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return list_data.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return list_data.indexOf(arg0); } @Override public View getView(int position, View convertView, ViewGroup parent) { item_pro my_item; Integer i = 0; if (convertView == null) { my_item = new item_pro(ctx, (String)list_data.get(position).txt_no.getText(), (String)list_data.get(position).txt_name.getText(), (String)list_data.get(position).txt_size.getText(), list_data.get(position).is_chk); } else { my_item = (item_pro)convertView; my_item.txt_no.setText(list_data.get(position).txt_no.getText()); my_item.txt_name.setText(list_data.get(position).txt_name.getText()); my_item.txt_size.setText(list_data.get(position).txt_size.getText()); } CheckBox chk_item = (CheckBox) my_item.chk_pro; chk_item.setOnClickListener(this); chk_item.setChecked(list_data.get(position).is_chk); chk_item.setTag(position); return my_item; } public void addItem(String txt_no, String txt_name, String str_size, Boolean bol_chk) { list_data.add(new item_pro(ctx,txt_no,txt_name,str_size,bol_chk)); } @Override public void onClick(View v) { // TODO Auto-generated method stub CheckBox c = (CheckBox) v; int pos = Integer.parseInt(v.getTag().toString()); list_data.get(pos).is_chk = c.isChecked(); } } // pro列表的一行 class item_pro extends LinearLayout{ public CheckBox chk_pro; // 进程号 public TextView txt_no; // 进程名 public TextView txt_name; // 占用内存大小 public TextView txt_size; // 是否选中 public boolean is_chk; public item_pro(Context ctx, String str_no, String str_name, String str_size, Boolean bol_chk) { super(ctx); this.setOrientation(HORIZONTAL); int hei = 80; chk_pro = new CheckBox(ctx); addView(chk_pro, new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei)); txt_no = new TextView(ctx); txt_no.setText(str_no); addView(txt_no, new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei)); txt_name = new TextView(ctx); txt_name.setText(str_name); addView(txt_name, new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.4),hei)); txt_size = new TextView(ctx); txt_size.setText(str_size); addView(txt_size, new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei)); is_chk = bol_chk; } }
Java文件实现了三个类。process类是整个Activity的类,list_pro是适配器类,item_pro是列表里面的一行。
在process类的get_pro()方法里面,语句am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)获得了一个ActivityManager,List<ActivityManager.RunningAppProcessInfo> pi = am.getRunningAppProcesses()获得了系统的所有进程,并存储在列表pi里面。语句ActivityManager.RunningAppProcessInfo pii = (ActivityManager.RunningAppProcessInfo) pi.get(i)获得了每一个进程信息,pii.processName是该进程的进程名(通常是该进程对应的包名),mi[0].dalvikPrivateDirty是该进程占用的内存大小(通常以KB为单位)。在unload (String n)方法里面,am.killBackgroundProcesses(n)结束了进程名为n的进程,不过要在AndroidManifest.xml中加入android.permission.KILL_BACKGROUND_PROCESSES权限,否则会出现权限错误。
运行效果如下。
需要注意的是,系统进程是不能结束的。