Android 读取正在运行非系统的程序

本文介绍了一个安卓应用管理器的设计与实现过程,包括自定义ListView显示正在运行的应用信息,如程序名称、图标、包名、进程ID及进程名称等,并通过自定义适配器将数据绑定到ListView中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)创建RunningAppInfo类,代码如下

package com.example.runningapps;

import android.graphics.drawable.Drawable;

public class RunningAppInfo {
	
	/*程序名称*/
	private String appLabel;
	
	public void SetAppLabel(String _appLabel){
		this.appLabel=_appLabel;
	}
	
	public String GetAppLabel(){
		return this.appLabel;
	}
	/*程序图标*/
	private Drawable appIcon;
	
	public void SetAppIcon(Drawable _appIcon){
		this.appIcon=_appIcon;
	}
	
	public Drawable GetAppIcon(){
		return appIcon;
	}
	
	/*包名称*/
	private String pkgName;
	
	public void SetPkgName(String _pkgName){
		this.pkgName=_pkgName;
	}
	
	public String GetPkgName(){
		return this.pkgName;
	}
	/*进程id*/
	private int pid;
	
	public void SetPid(int _pid){
		this.pid=_pid;
	}
	
	public int GetPid(){
		return this.pid;
	}
	
	/*进程名称*/
	private String processName;
	
	public void SetProcessName(String _processName){
		this.processName=_processName;
	}
	
	public String GetProcessName(){
		return processName;
	}
}


2)创建applist.xml作为自定义ListView的样式代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <ImageView
        android:id="@+id/appIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/appLabel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="5dp"
                android:text="TextView" />
            <TextView
                android:id="@+id/pkgName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="5dp"
                android:text="TextView" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
            <TextView
                android:id="@+id/pid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="5dp"
                android:text="TextView" />
            <TextView
                android:id="@+id/processName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="5dp"
                android:text="TextView" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>


3)创建MyListAdapter.java作为自定ListAdapeter代码如下

package com.example.runningapps;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

class MyListAdapter extends BaseAdapter {
	private ArrayList<RunningAppInfo> apps=null;
	private Context context=null;
	public MyListAdapter(ArrayList<RunningAppInfo> _apps,Context _context)
	{
		this.apps=_apps;
		this.context=_context;
	}  
    public int getCount() {  
        //设置绘制数量  
        return apps.size();  
    }  
  
    @Override  
    public boolean areAllItemsEnabled() { 
        return false;  
    }  
  
    public Object getItem(int position) {  
        return position;  
    }  
  
    public long getItemId(int position) {  
        return position;  
    }  
  
    public View getView(int position, View convertView, ViewGroup parent) {  
        ImageView appIconImageView=null;
        TextView appLabelTextView=null;
        TextView pkgNameTextView=null;
        TextView pidTextView=null;
        TextView processNameTextView=null;
        if (convertView == null || position < apps.size()) {  
        convertView = LayoutInflater.from(context).inflate(  
            R.layout.applist, null);  
        appIconImageView = (ImageView) convertView.findViewById(R.id.appIcon);  
        appLabelTextView = (TextView) convertView.findViewById(R.id.appLabel);  
        pkgNameTextView = (TextView) convertView.findViewById(R.id.pkgName);  
        pidTextView = (TextView) convertView.findViewById(R.id.pid);  
        processNameTextView = (TextView) convertView.findViewById(R.id.processName); 
        }
        /*图标*/
        appIconImageView.setImageDrawable(apps.get(position).GetAppIcon());
        /*应用程序名称*/
        appLabelTextView.setText(apps.get(position).GetAppLabel());
        /*包名称*/
        pkgNameTextView.setText(apps.get(position).GetPkgName());
        /*进程id*/
        pidTextView.setText(Integer.toString(apps.get(position).GetPid()));
        /*进程名称*/
        processNameTextView.setText(apps.get(position).GetProcessName());
        return convertView;  
    }  
}  


4)修改MainActivity.java代码将自定ListAdapeter绑定给ListView代码如下

package com.example.runningapps;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

	private PackageManager pm=null;
	private ListView listview1=null;
	private MyListAdapter adapter=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listview1=(ListView)findViewById(R.id.listView1);
		ArrayList<RunningAppInfo> runningApps=queryAllRunningAppInfo();
		adapter=new MyListAdapter(runningApps, MainActivity.this);
		listview1.setAdapter(adapter);
	}
	
	/* 查找正在运行的应用程序
	 * 1)获取系统安装的所有应用程序
	 * 2)根据报名pkgname过滤获取真正运行的应用程序
	 * */
	private ArrayList<RunningAppInfo> queryAllRunningAppInfo(){
		pm=this.getPackageManager();
		ArrayList<RunningAppInfo> runningApps=new ArrayList<RunningAppInfo>();
		//获取所有已经安装的应用程序
		List<ApplicationInfo> installedApps=pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
		//排序
		Collections.sort(installedApps,new ApplicationInfo.DisplayNameComparator(pm));
		//保存所有正在运行的包名以及它所在的进程信息
		Map<String, RunningAppProcessInfo> pgkProcessAppMap=new HashMap<String, ActivityManager.RunningAppProcessInfo>();
		//通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
		ActivityManager mActivityManager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
		List<RunningAppProcessInfo> runningAppProcesses=mActivityManager.getRunningAppProcesses();
		for (RunningAppProcessInfo runningAppProcess : runningAppProcesses) {
			//获得正在运行在该进程里的所有应用程序包
			String[] pkgNameList=runningAppProcess.pkgList;
			for (String pkgName : pkgNameList) {
				//将所有的应用程序包添加到map对象里
				pgkProcessAppMap.put(pkgName, runningAppProcess);
			}
		}
		//遍历安装了应用程序
		for (ApplicationInfo installedApp : installedApps) {
			if(pgkProcessAppMap.containsKey(installedApp.packageName)){//安装程序正在运行
				if((installedApp.flags&installedApp.FLAG_SYSTEM)==0){//非系统应用程序
					RunningAppInfo item=new RunningAppInfo();
					item.SetPid(pgkProcessAppMap.get(installedApp.packageName).pid);
					item.SetProcessName(pgkProcessAppMap.get(installedApp.packageName).processName);
					item.SetAppLabel((String)installedApp.loadLabel(pm));
					item.SetAppIcon(installedApp.loadIcon(pm));
					item.SetPkgName(installedApp.packageName);
					runningApps.add(item);
				}
			}
		}
		return runningApps;
	}

	@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;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值