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

如有疑问或者建议我乐意和大家交流

时间: 2024-08-02 23:57:23

Android获取正在运行的程序并kill掉它的相关文章

android 获取手机的所有程序和widget的包名和启动类名

获取 widget可以 AppWidgetManager 来获取 List<AppWidgetProviderInfo> widget=AppWidgetManager.getInstance(Context(上下文)).getInstalledProviders(); 得到所有AppWidgetProviderInfo for (int i = 0; i < widget.size(); i++) {        AppWidgetProviderInfo info=widget.g

获取指定进程号,并kill掉

直接上案例: 例子:获取gerrit进程 方法:$ps -aux |grep nginx |grep -v grep |awk '{print $2}'  或者 $ps -ef |grep nginx |grep -v grep |awk '{print $2}' 例子:获取gerrit进程并kill掉 方法:$ps -aux |grep gerrit |grep -v grep |awk '{print "kill -9 " $2}' |sh 或者 $ps -ef |grep ger

Android获取后台运行服务Get Running Service

完整的代码可以在我的GitHub上看到,链接在文末.效果图: Main: package com.zms.getrunningservice; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import android.app.Activity; import android.app.ActivityManager; imp

Android获取验证码后倒计时程序

在开发是经常会遇到获取短信验证码,然后获取验证码后需要等待1分钟倒计时,这是是不能再次发送短信请求的,这是需要一个倒计时程序 这里我封装了一个Util类,希望对开发的小伙伴能有帮助, public class TimeCountUtil extends CountDownTimer { private Activity mActivity; private Button btn;//按钮 // 在这个构造方法里需要传入三个参数,一个是Activity,一个是总的时间millisInFuture,

android获取当前运行Activity的名字(解决避免及时聊天再出现通知)

最近在做IM时需要知道当前Activity是哪一个Activity.自己整理一下两种方法 第一种:要方便一点 private String getRunningActivityName() { String contextString = context.toString(); return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));

android 程序防止被360或者系统给kill掉

关于如果和防止android 程序防止被360kill掉之后重启的问题,肯定大家也搜索了好多方法,都不好使,对不对,什么增高权限了,什么进程优先级了,这些东西都不是我们可控的,所以有没有一些非常保险的方法,让程序被kill掉之后自动重启呢. 大家发现没有,当我们使用360进行程序清理的时候,有些应用自己快速的启动起来了,他们是怎么实现的呢?其实我们没有见过他们的源码,也不好说是怎么实现的. 我在下面将为大家提供一些思路,也许会对你有所帮助: windows上流氓软件和病毒特别多,有时候你根本查杀

Android NDK:②第一个NDK程序(创建步骤&amp;一些问题)

Android NDK:②第一个NDK程序(创建步骤&一些问题) 本节内容是:演示搭建第一个NDK程序 Android NDK第一个NDK程序创建步骤一些问题 创建一个Android Project Java代码中声明native方法 创建Jni文件夹编写ccpp代码 为项目添加NDK支持 新建配置一个Builder 调用了native方法的地方加载库 好了把程序跑起来 总结 遇到的问题 1.创建一个Android Project 直接创建一个新的Android Application Proj

Android错误之--&#39;keytool&#39; 不是内部或外部命令,也不是可运行的程序

要用到高德地图的SDK,首先要获取sha1,获取Android studio下的sha1的方法可以切到.android下,输入命令: keytool -list -keystore debug.keystore .但是会出现如下错误: 分析原因,原理是没有正确配置java环境变量,正确配置环境变量的方法可以参考如下链接: http://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html 这时可以在Android studio的Termi

android 正在运行的程序与界面

判断某个程序正在运行,得首先得到正在运行任务的列表, 首先 加入权限 <uses-permission android:name="android.permission.GET_TASKS" />,否则可能会有exception抛出. //判断应用是否在运行 ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTask