Android获取正在运行的程序并kill掉它
获取正在运行的程序并把它加入到一个listview的adapter类面,方法如下:
// 正在运行的 public List<Programe> getRunningProcess() { pi = new PackagesInfo(this); am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); // 获取正在运行的应用 run = am.getRunningAppProcesses(); // 获取包管理器,在这里主要通过包名获取程序的图标和程序名 pm = this.getPackageManager(); List<Programe> list = new ArrayList<Programe>(); for (RunningAppProcessInfo ra : run) { // 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。 if (ra.processName.equals("system") || ra.processName.equals("com.android.phone")) { continue; } if (pi.getInfo(ra.processName) == null) { continue; } int[] myMempid = new int[] { ra.pid }; Programe pr = new Programe(); String xx = "" + ra.processName; Log.d("zphlog", "ra.processName=" + xx); pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm)); pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString()); System.out.println(pi.getInfo(ra.processName).loadLabel(pm) .toString()); // PID pr.setPID("PID:" + ra.pid); // memory Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid); double memSize = memoryInfo[0].dalvikPrivateDirty / 1024.0; int temp = (int) (memSize * 100); memSize = temp / 100.0; pr.setMemory("Memory:" + memSize); list.add(pr); } return list; }
下面是获取正在运行程序,手机剩余可运行内存的方法:
// 更新可用内存信息 public void upDateMemAndPakInfo() { // 获得MemoryInfo对象 ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); // 获得系统可用内存,保存在MemoryInfo对象上 am.getMemoryInfo(memoryInfo); long memSize = memoryInfo.availMem; // 字符类型转换 String restMemSize = Formatter .formatFileSize(getBaseContext(), memSize); mRestMemory.setText("剩余空间还有:" + restMemSize); // mPakcgeNums.setText(run.size()); mPakcgeNums.setText("正在运行的有:" + run.size() + "个"); }
看一下效果图
下面是详细代码:
ActivityMain.java
public class ActivityMain extends Activity { private static final int MSG_REFRESH = 555; private static final int MSG_KILL = 444; private ListView mListView; private Button mKillBtn; private Button mRefreshBtn; private TextView mPakcgeNums; private TextView mRestMemory; private PackagesInfo pi; private ActivityManager am; private List<RunningAppProcessInfo> run; private PackageManager pm; private long mExitTime; private static final int EXIT = 0x113; private static final int ABOUT = 0x114; private static final int INFO = 0x115; private static final int SHARE = 0x116; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.list); mKillBtn = (Button) findViewById(R.id.kill_all); mRefreshBtn = (Button) findViewById(R.id.refresh_run); mPakcgeNums = (TextView) findViewById(R.id.packagenums); mRestMemory = (TextView) findViewById(R.id.restmemory); List<Programe> list = getRunningProcess(); ListAdapter adapter = new ListAdapter(list, this); mListView.setAdapter(adapter); upDateMemAndPakInfo();// 显示Memory信息 // getListView().setAdapter(adapter); mKillBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub handler.sendEmptyMessage(MSG_KILL); } }); mRefreshBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new Thread() { public void run() { handler.sendEmptyMessage(MSG_REFRESH); } }.start(); } }); } // 正在运行的 public List<Programe> getRunningProcess() { pi = new PackagesInfo(this); am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); // 获取正在运行的应用 run = am.getRunningAppProcesses(); // 获取包管理器,在这里主要通过包名获取程序的图标和程序名 pm = this.getPackageManager(); List<Programe> list = new ArrayList<Programe>(); for (RunningAppProcessInfo ra : run) { // 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。 if (ra.processName.equals("system") || ra.processName.equals("com.android.phone")) { continue; } if (pi.getInfo(ra.processName) == null) { continue; } int[] myMempid = new int[] { ra.pid }; Programe pr = new Programe(); String xx = "" + ra.processName; Log.d("zphlog", "ra.processName=" + xx); pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm)); pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString()); System.out.println(pi.getInfo(ra.processName).loadLabel(pm) .toString()); // PID pr.setPID("PID:" + ra.pid); // memory Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid); double memSize = memoryInfo[0].dalvikPrivateDirty / 1024.0; int temp = (int) (memSize * 100); memSize = temp / 100.0; pr.setMemory("Memory:" + memSize); list.add(pr); } return list; } Handler handler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSG_REFRESH: List<Programe> list = getRunningProcess(); ListAdapter adapter = new ListAdapter(list, ActivityMain.this); mListView.setAdapter(adapter); upDateMemAndPakInfo(); Toast.makeText(ActivityMain.this, "刷新成功", Toast.LENGTH_SHORT) .show(); break; case MSG_KILL: for (RunningAppProcessInfo ra : run) { // 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。 if (ra.processName.equals("system") || ra.processName.equals("com.android.phone")) { continue; } if (pi.getInfo(ra.processName) == null) { continue; } am.killBackgroundProcesses(ra.processName); // Log.d("zphlog","pid="+ra.pid); } Toast.makeText(ActivityMain.this, "kill 成功", Toast.LENGTH_SHORT) .show(); break; } } }; // 更新可用内存信息 public void upDateMemAndPakInfo() { // 获得MemoryInfo对象 ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); // 获得系统可用内存,保存在MemoryInfo对象上 am.getMemoryInfo(memoryInfo); long memSize = memoryInfo.availMem; // 字符类型转换 String restMemSize = Formatter .formatFileSize(getBaseContext(), memSize); mRestMemory.setText("剩余空间还有:" + restMemSize); // mPakcgeNums.setText(run.size()); mPakcgeNums.setText("正在运行的有:" + run.size() + "个"); } // 点击手机返回键返回到上一个界面 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { finish(); } return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, ABOUT, 0, "关于应用"); menu.add(0, INFO, 0, "系统信息"); menu.add(0, SHARE, 0, "分享应用"); menu.add(0, EXIT, 0, "退出应用"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem mi){ switch (mi.getItemId()){ case ABOUT: about_info(); break; case INFO: system_info(); break; case SHARE: share(); break; case EXIT: finish(); break; } return true; } public void about_info(){ Intent intent = new Intent(this, AboutTaskKiller.class); startActivity(intent); } public void system_info(){ Intent intent = new Intent(this, SystemInfo.class); startActivity(intent); } public void share(){ Intent intent=new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); //纯文本 intent.putExtra(Intent.EXTRA_SUBJECT, "分享"); intent.putExtra(Intent.EXTRA_TEXT, "我发现了一个好用的TaskKiller"); startActivity(intent); } }ListAdapter.java
public class ListAdapter extends BaseAdapter { List<Programe> list = new ArrayList<Programe>(); LayoutInflater la; Context context; public ListAdapter(List<Programe> list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.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) { ViewHolder holder; if (convertView == null) { la = LayoutInflater.from(context); convertView = la.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.imgage = (ImageView) convertView.findViewById(R.id.image); holder.text = (TextView) convertView.findViewById(R.id.text); holder.PID = (TextView) convertView.findViewById(R.id.pid); holder.memory = (TextView) convertView.findViewById(R.id.memory); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Programe pr = (Programe) list.get(position); // 设置图标 holder.imgage.setImageDrawable(pr.getIcon()); // 设置程序名 holder.text.setText(pr.getName()); // 设置PID holder.PID.setText(pr.getPID()); // 设置memory holder.memory.setText(pr.getMemory()); return convertView; } } class ViewHolder { TextView text; ImageView imgage; TextView memory; TextView PID; }
Programe.java
public class Programe { // 图标 private Drawable icon; // 程序名 private String name; private String pID; private String memory; public Drawable getIcon() { return icon; } public void setIcon(Drawable icon) { this.icon = icon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setPID(String id){ this.pID = id; } public String getPID(){ return pID; } public void setMemory(String m){ this.memory = m; } public String getMemory(){ return memory; } }
activity_main.xml
<RelativeLayout 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" tools:context=".ActivityMain" > <LinearLayout android:id="@+id/layout_info" android:layout_width="fill_parent" android:layout_height="35dip" android:background="#B0C4DE" android:orientation="horizontal" > <TextView android:id="@+id/packagenums" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dip" android:layout_weight="1" android:text="packagenums" android:textColor="#000000" android:textSize="14sp" /> <TextView android:id="@+id/restmemory" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dip" android:layout_weight="1" android:text="packagenums" android:textColor="#000000" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:id="@+id/layout_buttons" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/layout_info" android:background="#808080" android:orientation="horizontal" > <Button android:id="@+id/kill_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dip" android:layout_weight="1" android:text="kill All" /> <Button android:id="@+id/refresh_run" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dip" android:layout_weight="1" android:text="refresh" /> </LinearLayout> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/layout_buttons" android:background="#808080" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" /> </RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/image" android:layout_width="50dip" android:layout_height="50dip" android:layout_marginLeft="10dip" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_toRightOf="@id/image" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="package" /> <TextView android:id="@+id/pid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="pid" /> <TextView android:id="@+id/memory" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="memory" /> </LinearLayout> </RelativeLayout>
以上都是主要实现的代码,因为篇幅的原因,我就不再这里继续粘贴代码了,大概总结一下我的思路。
首先就是最开始我谈到的获取正在运行的程序信息。
可以通过下面的方式得到
// 正在运行的
public List<Programe> getRunningProcess() {
pi = new PackagesInfo(this);
am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
// 获取正在运行的应用
run = am.getRunningAppProcesses();
// 获取包管理器,在这里主要通过包名获取程序的图标和程序名
pm = this.getPackageManager();
List<Programe> list = new ArrayList<Programe>();
for (RunningAppProcessInfo ra : run) {
// 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。
if (ra.processName.equals("system")
|| ra.processName.equals("com.android.phone")) {
continue;
}
if (pi.getInfo(ra.processName) == null) {
continue;
}
int[] myMempid = new int[] { ra.pid };
Programe pr = new Programe();
String xx = "" + ra.processName;
Log.d("zphlog", "ra.processName=" + xx);
pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
System.out.println(pi.getInfo(ra.processName).loadLabel(pm)
.toString());
// PID
pr.setPID("PID:" + ra.pid);
// memory
Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);
double memSize = memoryInfo[0].dalvikPrivateDirty / 1024.0;
int temp = (int) (memSize * 100);
memSize = temp / 100.0;
pr.setMemory("Memory:" + memSize);
list.add(pr);
}
return list;
}
然后就是把得到的信息保存在listview的一个Adapter里面。
接着就是kill掉他们,我在网上看到有三种方式可以kill程序,我这里用的方法是
for (RunningAppProcessInfo ra : run) { // 这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。 if (ra.processName.equals("system") || ra.processName.equals("com.android.phone")) { continue; } if (pi.getInfo(ra.processName) == null) { continue; } am.killBackgroundProcesses(ra.processName); // Log.d("zphlog","pid="+ra.pid); }当然是在for循环里面进行的,后面就是加了一些其他的东西,比如启动的时候要扫描正在运行的程序需要一段时间,我们可以给程序启动的时候让它读取一个图片,停留两秒或者三秒来争取加载运行程序列表信息的时间。
我用的是一个Activity 命名StartUI.java
public class StartUI extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.welcome_activity); new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(StartUI.this, ActivityMain.class); startActivity(intent); StartUI.this.finish(); } }, 2500); } }它的布局文件其实就是个简单的ImageView。
下面附上我写的一个简单Demo,源码下载地址
http://download.csdn.net/detail/u010443618/7829959做好的Apk下载地址
http://download.csdn.net/detail/u010443618/7829977
如有疑问或者建议我乐意和大家交流
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。