android实现获取正在运⾏的应⽤程序因为在framework中想添加这个功能,所以写了个appliction来实现⼀下获取正在运⾏的应⽤程序:还是先看图吧:这个app主要是简单的实现了获取⾮系统的应⽤程序和⼀些常⽤的系统应⽤程序,显⽰在⼀个listview中,并添加了点击(回复到你打开的界⾯)和长按事件(关闭应⽤程序)。
看看代码吧:直接贴出来再加上注释吧(直接写在⼀个⽂件⾥):复制代码代码如下:package andorid.tasks;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.app.ActivityManager;import android.app.ActivityManager.RunningAppProcessInfo;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.AdapterView.OnItemClickListener;import android.widget.SimpleAdapter.ViewBinder;public class ManagerTasksActivity extends Activity {private ListView listView;private PackageManager pm;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.task_main);pm= this.getPackageManager();//获得包管理器listView=(ListView)findViewById(R.id.list_view);LoadList(this);//加载listview}private void LoadList(Context context){ArrayList<HashMap<String, Object>> list=new ArrayList<HashMap<String, Object>>();try{ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); //获得ActivityManager对象List<RunningAppProcessInfo> runningTasks = am.getRunningAppProcesses(); //获得所有正在进⾏的程序存放在⼀个list中for(int i=0;i<runningTasks.size();i++){PackageInfo pInfo=new PackageInfo(context);//获得PackageInfo对象//get application which is not in system and the usually//如果是⾮系统应⽤程序以及⼀些常⽤的应⽤程序就加到list中if((pInfo.getInfo(runningTasks.get(i).processName).flags&pInfo.getInfo(runningTasks.get(i).processName).FLAG_SYSTEM)==0 ||(runningTasks.get(i).processName).equals("com.android.contacts")||(runningTasks.get(i).processName).equals("com.android.email")||(runningTasks.get(i).processName).equals("com.android.settings")||(runningTasks.get(i).processName).equals("com.android.music")||(runningTasks.get(i).processName).equals("com.android.calendar")||(runningTasks.get(i).processName).equals("com.android.calculator2")||(runningTasks.get(i).processName).equals("com.android.browser")||(runningTasks.get(i).processName).equals("com.android.camera")||(runningTasks.get(i).processName).equals("com.cooliris.media")||(runningTasks.get(i).processName).equals("com.android.bluetooth")||(runningTasks.get(i).processName).equals("com.android.mms")){String dir = pInfo.getInfo(runningTasks.get(i).processName).publicSourceDir;Float size=Float.valueOf((float) ((new File(dir).length()*1.0)));//获得应⽤程序的⼤⼩如果size⼤于⼀M就⽤M为单位,否则⽤KB //long date = new Date(new File(dir).lastModified()).getTime();//System.out.println(pInfo.getInfo(runningTasks.get(i).processName).loadIcon(pm));HashMap<String, Object> map=new HashMap<String, Object>();map.put("icon", pInfo.getInfo(runningTasks.get(i).processName).loadIcon(pm));map.put("name", pInfo.getInfo(runningTasks.get(i).processName).loadLabel(pm));if(size>1024*1024)map.put("info", size/1024/1024+" MB");elsemap.put("info", size/1024+" KB");map.put("packagename", runningTasks.get(i).processName.toString());//获得包名给后⾯⽤list.add(map);}}}catch(Exception ex){}SimpleAdapter listadapter=new SimpleAdapter(this, list, yout.task_list, new String[]{"icon","name","info"}, new int []{R.id.icon,,});listView.setAdapter(listadapter);//listview加载识别器//下⾯这个⽅法主要是⽤来刷新图⽚,因为pInfo.getInfo(runningTasks.get(i).processName).loadIcon(pm)获得图⽚不能被显⽰出listadapter.setViewBinder(new ViewBinder(){public boolean setViewValue(View view,Object data,String textRepresentation){if(view instanceof ImageView && data instanceof Drawable){ImageView iv=(ImageView)view;iv.setImageDrawable((Drawable)data);return true;}elsereturn false;}//为listView添加item的点击事件listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {//get the item of the list to a hashmapHashMap<?, ?> map=(HashMap<?, ?>)parent.getItemAtPosition(position);//get package name from mapString packageName=(String) map.get("packagename");//从前⾯的map中获得包名//if we onclick the item then start the application//根据包名打开应⽤程序Intent intent=new Intent();intent =pm.getLaunchIntentForPackage(packageName);startActivity(intent);finish();//打开应⽤程序之后注销本应⽤程序}});//为listview的item添加长按事件listView.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {final HashMap<?, ?> long_map=(HashMap<?, ?>)parent.getItemAtPosition(position);new AlertDialog.Builder(ManagerTasksActivity.this).setTitle("Are you sure close").setPositiveButton("sure", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); String packageName=(String)long_map.get("packagename");//base packagename to kill appliction//根据包名杀死应⽤程序am.killBackgroundProcesses(packageName);//refash list//刷新listviewLoadList(ManagerTasksActivity.this);}}).setNegativeButton("cancle", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();return false;}});}}//类PackageInfo主要包括ApplicationInfo getInfo(String name)⽅法class PackageInfo {private List<ApplicationInfo> appList;public PackageInfo(Context context){//get all package dataPackageManager pm = context.getApplicationContext().getPackageManager();appList = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); }public ApplicationInfo getInfo(String name){if(name == null){return null;}for(ApplicationInfo appInfo : appList){if(name.equals(appInfo.processName)){return appInfo;}return null;}}xml⽂件:lsit:复制代码代码如下:<LinearLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/icon"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:layout_width="40dip"android:layout_height="40dip"/><LinearLayoutandroid:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textStyle="bold"/><TextViewandroid:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></LinearLayout>main:复制代码代码如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ListViewandroid:id="@+id/list_view"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"></ListView></LinearLayout>在manifest⽂件中要加⼀个权限:复制代码代码如下:<uses-permission android:name="android.permission.RESTART_PACKAGES" /> 主要是前⾯的am.killBackgroundProcesses(packageName);⽅法要这个权限。