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>