这一个月在联系手机安全卫士的例子。这其中涉及到了进程管理这个模块。和其他安全卫士的进程管理相类似,这里提供的功能是查看系统所使用的内存的情况以及剩余的内存的情况,有哪些应用
* 在后台运行,选择并结束指定的进程。这里涉及到了以下的知识点:
* 第一,如何获得系统的内存使用情况。
* 第二,如何获得后台的进程。
* 第三,如何获得用户的进程。
* 第四,如何杀死用户进程。
* 一看到这四个要求感觉无从下手。。。但是,熟悉了API之后会发现原来他们很简单。对类的不熟悉导致了所谓的困难。
* 这里主要用到了以下几个类:
* 在后台运行,选择并结束指定的进程。这里涉及到了以下的知识点:
* 第一,如何获得系统的内存使用情况。
* 第二,如何获得后台的进程。
* 第三,如何获得用户的进程。
* 第四,如何杀死用户进程。
* 一看到这四个要求感觉无从下手。。。但是,熟悉了API之后会发现原来他们很简单。对类的不熟悉导致了所谓的困难。
* 这里主要用到了以下几个类:
* ActivityManager,PackageManager,ApplicationInfo,RunningAppProcessInfo,MemoryInfo这几个主要的类。
ActivityManager的类的主要管理动态的用户数据
,它可以管理系统中的所有的Activity。
好好看看这几个类的方法就可以找到解决上面几个问题的方法。下面是一个简单的demo,实现了上面的功能:
package com.example.processmanager;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity
{
private ActivityManager am;
private long availMemory;
private MemoryInfo memoryInfo;
private String tag = "info";
private ListView list;
private ArrayList<AppInfo> appList;
private PackageManager pm;
private BaseAdapter adapter;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
appList = new ArrayList<AppInfo>();
// to get the ActivityManager
am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
pm = getPackageManager();
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg.what == 0x111)
{
list.setAdapter(adapter);
}
}
};
// 开始线程来获得信息
new MyThread().start();
adapter = new BaseAdapter()
{
@Override
public int getCount()
{
// TODO Auto-generated method stub
return appList.size();
}
@Override
public Object getItem(int position)
{
// TODO Auto-generated method stub
return appList.get(position);
}
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = View.inflate(getApplicationContext(),
R.layout.task_activity_item, null);
}
ImageView iv = (ImageView) convertView
.findViewById(R.id.task_item_iv);
TextView name = (TextView) convertView
.findViewById(R.id.task_item_name);
TextView mem = (TextView) convertView
.findViewById(R.id.task_item_memory);
AppInfo info = appList.get(position);
iv.setBackgroundDrawable(info.getDrawable());
name.setText(info.getLabel());
mem.setText(info.getMemory());
return convertView;
}
};
list.setOnItemLongClickListener(new OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id)
{
am.killBackgroundProcesses(appList.get(position).getPkg());
appList.remove(position);
adapter.notifyDataSetChanged();
return false;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class MyThread extends Thread
{
@Override
public void run()
{
appList.clear();
List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
for (RunningAppProcessInfo info : list)
{
try
{
// 通过RunningAppProcessInfo来得到所有的包,在得到所有正在运行的进程。这里包括系统进程和用户进程
String[] pkgNames = info.pkgList;
int pid = info.pid;
String pkgName = pkgNames[0];
ApplicationInfo app = pm.getApplicationInfo(pkgName,
PackageManager.GET_UNINSTALLED_PACKAGES);
int flags = app.flags;
// 我们只显示用户进程,所以在这里坐下判断
if (AppInfo.isUserProcess(flags))
{
String label = (String) app.loadLabel(pm);
Drawable drawable = app.loadIcon(pm);
android.os.Debug.MemoryInfo[] memoryInfos = am
.getProcessMemoryInfo(new int[] { pid });
android.os.Debug.MemoryInfo memoryInfo = memoryInfos[0];
int memSize = memoryInfo.dalvikPrivateDirty;
AppInfo appInfo = new AppInfo();
appInfo.setDrawable(drawable);
appInfo.setFlag(flags);
appInfo.setLabel(label);
appInfo.setMemory(MemoryFormat.formatData(memSize));
appInfo.setPkg(pkgName);
appList.add(appInfo);
}
} catch (Exception e)
{
e.printStackTrace();
}
}
handler.sendEmptyMessage(0x111);
}
}
}
class MemoryFormat
{
public static String formatData(long data)
{
DecimalFormat format = new DecimalFormat("#.##");
if (data < 1024)
{
return data + "KB";
}
if (data < 1024 * 1024)
{
return format.format(data / 1024f) + "MB";
}
return "" + 0;
}
}
class AppInfo
{
private String label;
private Drawable drawable;
private String memory;
private int flag;
private String pkg;
public String getPkg()
{
return pkg;
}
public void setPkg(String pkg)
{
this.pkg = pkg;
}
public int getFlag()
{
return flag;
}
public void setFlag(int flag)
{
this.flag = flag;
}
public String getLabel()
{
return label;
}
public void setLabel(String label)
{
this.label = label;
}
public Drawable getDrawable()
{
return drawable;
}
public void setDrawable(Drawable drawable)
{
this.drawable = drawable;
}
public String getMemory()
{
return memory;
}
public void setMemory(String memory)
{
this.memory = memory;
}
// 通过标志位来判断是否用户进程
public static boolean isUserProcess(int flag)
{
if ((flag & ApplicationInfo.FLAG_SYSTEM) != 0
|| (flag & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
{
return false;
}
return true;
}
}