View Post
android 檢視手機運作的程序清單
android 檢視手機運作的程序清單
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 定義擷取可用記憶體的按鈕 -->
<Button
android:id="@+id/btn_main_ablememory"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="可用 的記憶體"/>
<!-- 定義檢視正在運作的程序的按鈕 -->
<Button
android:id="@+id/btn_main_lookruningmemory"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="檢視正在運作的程序"/>
<!-- 定義顯示目前程序數的标簽控件 -->
<TextView
android:id="@+id/tv_main_currentprocessnum"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<!-- 定義程序清單控件 -->
<ListView
android:id="@+id/lv_main_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<!-- 定義擷取内容顯示的标簽控件 -->
<TextView
android:id="@+id/tv_main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</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>
<TextView android:id="@+id/tvProcessPID"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="3dip" android:textColor="#FFD700"></TextView>
</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>
<TextView android:id="@+id/tvProcessUID"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFD700"></TextView>
</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>
<TextView android:id="@+id/tvProcessMemSize"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFD700"></TextView>
</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>
<TextView android:id="@+id/tvProcessName"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFD700"></TextView>
</LinearLayout>
</LinearLayout>
package com.example.yanlei.yl2;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.os.Bundle;
import android.os.Debug;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
// 得到可用記憶體的按鈕對象
private Button btnEnableMember;
// 檢視運作的程式
private Button btnLookRuningMemory;
// 得到activity的管理對象
private ActivityManager mActivityManager;
// 顯示可用記憶體的标簽
private TextView tvText;
// 顯示程序的清單對象
private ListView listviewProcess;
// 程序數組對象
private ArrayList<ProcessInfo> processInfoList;
// 顯示程序總數的對象
private TextView tvCurrentProcessNum;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 得到布局中的控件
findView();
// 給控件設定監聽器
setListener();
// 得到ActivityManager服務
mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
}
private void setListener() {
// TODO Auto-generated method stub
btnEnableMember.setOnClickListener(listener);
btnLookRuningMemory.setOnClickListener(listener);
}
private void findView() {
// 得到布局中的控件對象
btnEnableMember = (Button) findViewById(R.id.btn_main_ablememory);
btnLookRuningMemory = (Button) findViewById(R.id.btn_main_lookruningmemory);
tvText = (TextView) findViewById(R.id.tv_main_text);
listviewProcess = (ListView) findViewById(R.id.lv_main_list);
tvCurrentProcessNum = (TextView) findViewById(R.id.tv_main_currentprocessnum);
}
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_main_ablememory:
// 得到系統可用的記憶體
String availMemStr = getSystemAvaialbeMemorySize();
// 設定textview的内容
tvText.setText(availMemStr);
// 設定textview可見
tvText.setVisibility(View.VISIBLE);
// 設定listview不可見
listviewProcess.setVisibility(View.GONE);
break;
case R.id.btn_main_lookruningmemory:
// 設定textview不可見
tvText.setVisibility(View.GONE);
// 設定listview可見
listviewProcess.setVisibility(View.VISIBLE);
// 獲得系統程序資訊
getRunningAppProcessInfo();
// 向擴充卡中放置資料源
setAdapter();
break;
default:
break;
}
}
};
protected String getSystemAvaialbeMemorySize() {
// TODO Auto-generated method stub
// 獲得MemoryInfo對象
MemoryInfo memoryInfo = new MemoryInfo();
// 獲得系統可用記憶體,儲存在MemoryInfo對象上
mActivityManager.getMemoryInfo(memoryInfo);
long memSize = memoryInfo.availMem;
// 字元類型轉換
String availMemStr = formateFileSize(memSize);
return availMemStr;
}
// 字元類型轉換
private String formateFileSize(long size) {
return Formatter.formatFileSize(MainActivity.this, size);
}
// 向擴充卡中放置資料源
protected void setAdapter() {
// TODO Auto-generated method stub
ProcessInfoAdapter mprocessInfoAdapter = new ProcessInfoAdapter(this,
processInfoList);
listviewProcess.setAdapter(mprocessInfoAdapter);
}
// 獲得系統程序資訊
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;
// 構造一個ProcessInfo對象
ProcessInfo processInfo = new ProcessInfo();
// 設定processinfo資訊
processInfo.setPid(pid);
processInfo.setUid(uid);
processInfo.setMemSize(memSize);
processInfo.setProcessName(processName);
// 添加到processInfoList中
processInfoList.add(processInfo);
}
// 得到程序個數
tvCurrentProcessNum.setText("目前系統程序共有:" + processInfoList.size());
}
}
ProcessInfo.java
package com.example.yanlei.yl2;
//定義ProcessInfo類,代表一個程序的資訊
public class ProcessInfo {
private int pid; // 程序id Android規定android.system.uid=1000
private int uid; // 程序所在的使用者id ,即該程序是有誰啟動的 root/普通使用者等
private int memSize; // 程序占用的記憶體大小,機關為kb
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 setProcessName(String processName) {
this.processName = processName;
}
}
ProcessInfoAdapter.java
package com.example.yanlei.yl2;
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 ProcessInfoAdapter extends BaseAdapter {
// 需要顯示的對象清單
private List<ProcessInfo> mlistProcessInfo = null;
LayoutInflater infater = null;
public ProcessInfoAdapter(Context context, List<ProcessInfo> apps) {
// 初始化infater對象
infater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 初始化需要顯示的mlistProcessInfo對象
mlistProcessInfo = apps;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println("size" + mlistProcessInfo.size());
return mlistProcessInfo.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mlistProcessInfo.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertview, ViewGroup arg2) {
View view = null;
ViewHolder holder = null;
if (convertview == null || convertview.getTag() == null) {
// 通過XML得到VIEW
view = infater.inflate(R.layout.browse_process_item, null);
holder = new ViewHolder(view);
// 把查找的view緩存起來
view.setTag(holder);
} else {
view = convertview;
// 取出緩存的VIEW
holder = (ViewHolder) convertview.getTag();
}
// 得到ProcessInfo資訊,并在item的每個位置顯示相關資訊
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());
// 傳回需要顯示的view
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);
}
}
}