顯示所有APP的進程詳細信息(進程ID、進程所在UID、進程占用內存、進程名)


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> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM