应用程序管理器

TaskManager

 

MainActivity

package org.wp.activity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewSwitcher;
import android.widget.AdapterView.OnItemLongClickListener;

public class MainActivity extends Activity {
	private static final int INIT_WHAT = 1;
	private static final int NOTIFY_GRID_ADAPTER_WHAT = 2;
	private static final int NOTIFY_LIST_ADAPTER_WHAT = 3;

	// 滚动条Dialog
	private ProgressDialog pd;
	// 切换标题
	private TextView titleTextView;
	// 视图切换
	private ImageButton viewImageButton;
	private boolean isListView = true;
	// 网格视图
	private GridView gridViewShow;
	// 列表视图
	private ListView listViewShow;
	// 网格视图Adapter
	private GridViewAdapter gridViewAdapter;
	// 列表视图Adapter
	private ListViewAdapter listViewAdapter;
	// 底部主菜单
	private GridView navigationMenu;
	// 切换菜单
	private GridView switchMenu;
	// 切换详细菜单
	private View switchView;
	// 切换详细菜单Dialog
	private AlertDialog switchDialog;
	// 运行菜单
	private View runView;
	// 运行菜单Dialog
	private AlertDialog runDialog;
	// 运行菜单Gallery
	private Gallery gallery;
	// 运行菜单ImageSwitcher
	private ImageSwitcher imageSwitcher;
	// 应用图片所选position
	private int appDrawablePosition;
	// 查询LinearLayout
	private LinearLayout searchLinearLayout;
	// 查询EditText
	private EditText searchEditText;
	// 删除应用position集合
	private List<Integer> uninstallPositions;
	// 是否全部取消卸载
	private boolean cancelFlag = false;
	// 卸载监听器
	private UninstallReceiver uninstallReceiver;
	// 详细菜单
	private AlertDialog detailAlertDialog;
	// 详细Item位置
	private int detailPosition = -1;

	// 当前正在使用的应用程序列表数据
	private List<PackageInfo> currentPackageInfos;
	// 所有应用程序数据
	private List<PackageInfo> systemPackageInfos;
	// 用户安装应用程序数据
	private List<PackageInfo> consumPackageInfos;
	// 正在运行应用程序数据
	private List<PackageInfo> runningPackageInfos;
	// 当前正在使用的应用程序图标数据
	private List<Drawable> currentAppDrawables;
	// 所有应用程序图标数据
	private List<Drawable> systemAppDrawables;
	// 用户安装程序图标数据
	private List<Drawable> consumAppDrawables;
	// 正在运行应用图标数据
	private List<Drawable> runningAppDrawables;

	private int[] navigation_item_images = { R.drawable.n_menu_switch,
			R.drawable.n_menu_run, R.drawable.n_menu_search,
			R.drawable.n_menu_delete, R.drawable.n_menu_exit };
	private String[] navigation_item_texts = { "切换", "运行", "查询", "卸载", "退出" };
	private int[] switch_menu_images = { R.drawable.s_menu_running,
			R.drawable.s_menu_consum, R.drawable.s_menu_system };
	private String[] switch_menu_texts = { "正在运行", "用户安装", "全部应用" };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 去掉Title
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		// 滚动条Dialog(按取消键不能返回)
		pd = ProgressDialog.show(this, "请稍等...", "正在搜索您所安装的应用程序...", true,
				false);
		// 初始化数据
		Thread thread = new Thread(new LoadData());
		thread.start();

		titleTextView = (TextView) this.findViewById(R.id.titleText);
		gridViewShow = (GridView) this.findViewById(R.id.gridViewShow);
		listViewShow = (ListView) this.findViewById(R.id.listViewShow);

		// 标记删除的应用
		gridViewShow.setOnItemLongClickListener(new OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {
				if (uninstallPositions == null) {
					uninstallPositions = new ArrayList<Integer>();
				}
				LinearLayout ll = (LinearLayout) view;
				ImageView iv = (ImageView) ll.getChildAt(2);
				if (iv.getVisibility() == View.VISIBLE) {
					iv.setVisibility(View.GONE);
					uninstallPositions.remove(new Integer(position));
				} else {
					iv.setVisibility(View.VISIBLE);
					uninstallPositions.add(new Integer(position));
				}
				return false;
			}
		});

		// 标记删除的应用
		listViewShow.setOnItemLongClickListener(new OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {
				if (uninstallPositions == null) {
					uninstallPositions = new ArrayList<Integer>();
				}
				RelativeLayout rl = (RelativeLayout) view;
				ImageView iv = (ImageView) rl.getChildAt(2);
				if (iv.getVisibility() == View.VISIBLE) {
					iv.setVisibility(View.GONE);
					uninstallPositions.remove(new Integer(position));
				} else {
					iv.setVisibility(View.VISIBLE);
					uninstallPositions.add(new Integer(position));
				}
				return false;
			}
		});

		// 记录选中position
		gridViewShow.setOnItemClickListener(new GridView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				detailPosition = position;
			}
		});
		listViewShow.setOnItemClickListener(new GridView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				detailPosition = position;
			}
		});

		// 切换视图
		viewImageButton = (ImageButton) this.findViewById(R.id.viewImageButton);
		viewImageButton.setOnClickListener(new ImageButton.OnClickListener() {
			public void onClick(View v) {
				if (isListView) {
					uiHandler.sendEmptyMessage(NOTIFY_LIST_ADAPTER_WHAT);
					Toast.makeText(MainActivity.this, R.string.list_view,
							Toast.LENGTH_SHORT).show();
					viewImageButton.setImageResource(R.drawable.b_grid_view);
					gridViewShow.setVisibility(View.GONE);
					listViewShow.setVisibility(View.VISIBLE);
					isListView = false;
				} else {
					uiHandler.sendEmptyMessage(NOTIFY_GRID_ADAPTER_WHAT);
					Toast.makeText(MainActivity.this, R.string.grid_view,
							Toast.LENGTH_SHORT).show();
					viewImageButton.setImageResource(R.drawable.b_list_view);
					listViewShow.setVisibility(View.GONE);
					gridViewShow.setVisibility(View.VISIBLE);
					isListView = true;
				}
			}
		});

		searchLinearLayout = (LinearLayout) this
				.findViewById(R.id.searchLinearLayout);
		searchEditText = (EditText) this.findViewById(R.id.searchEditText);

		// 注册监听卸载广播
		uninstallReceiver = new UninstallReceiver();
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
		filter.addDataScheme("package");
		MainActivity.this.registerReceiver(uninstallReceiver, filter);
	}

	// 加载数据
	class LoadData implements Runnable {
		public void run() {
			// systemPackageInfos =
			// getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES
			// | PackageManager.GET_ACTIVITIES);
			// ==================================================================================
			// ActivityInfo activityInfo =
			// currentPackageInfos.get(0).activities[0];
			// ==================================================================================
			// String activityName = activityInfo.name;

			// 所有的应用程序
			systemPackageInfos = getPackageManager().getInstalledPackages(
					PackageManager.GET_UNINSTALLED_PACKAGES);

			if (systemPackageInfos != null) {
				systemAppDrawables = new ArrayList<Drawable>();
				consumPackageInfos = new ArrayList<PackageInfo>();
				consumAppDrawables = new ArrayList<Drawable>();
				// 载入所有的应用程序图标、查找用户安装的软件、载入用户安装的软件图标
				for (int i = 0; i < systemPackageInfos.size(); i++) {
					PackageInfo packageInfo = systemPackageInfos.get(i);
					ApplicationInfo applicationInfo = packageInfo.applicationInfo;
					systemAppDrawables.add(applicationInfo
							.loadIcon(getPackageManager()));
					boolean flag = false;
					if ((applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
						// Updated system app
						flag = true;
					} else if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
						// Non-system app
						flag = true;
					}
					if (flag) {
						consumPackageInfos.add(packageInfo);
						consumAppDrawables.add(applicationInfo
								.loadIcon(getPackageManager()));
					}
				}
			}

			// 查找正在运行的软件、载入正在运行的软件图标
			runningPackageInfos = new ArrayList<PackageInfo>();
			runningAppDrawables = new ArrayList<Drawable>();
			List<ActivityManager.RunningAppProcessInfo> procList = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE))
					.getRunningAppProcesses();
			for (ActivityManager.RunningAppProcessInfo appProcInfo : procList) {
				if (getPackageManager().getLaunchIntentForPackage(
						appProcInfo.processName) != null) {
					try {
						PackageInfo packageInfo = getPackageManager()
								.getPackageInfo(appProcInfo.processName,
										PackageManager.GET_META_DATA);
						if (packageInfo != null) {
							runningPackageInfos.add(packageInfo);
							runningAppDrawables.add(packageInfo.applicationInfo
									.loadIcon(getPackageManager()));
						}
					} catch (NameNotFoundException e) {
						e.printStackTrace();
					}
				}
			}

			// 更新UI
			uiHandler.sendEmptyMessage(INIT_WHAT);
		}
	}

	// 更新UI
	private Handler uiHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			// 初始化数据
			if (msg.what == INIT_WHAT) {
				currentPackageInfos = systemPackageInfos;
				currentAppDrawables = systemAppDrawables;
				gridViewAdapter = new GridViewAdapter(MainActivity.this,
						currentPackageInfos);
				listViewAdapter = new ListViewAdapter(MainActivity.this,
						currentPackageInfos);
				gridViewShow.setAdapter(gridViewAdapter);
				listViewShow.setAdapter(listViewAdapter);
				pd.dismiss();
			} else if (msg.what == NOTIFY_GRID_ADAPTER_WHAT) {
				// 刷新gridview
				if (gridViewAdapter != null) {
					gridViewAdapter.notifyDataSetChanged();
				}
			} else if (msg.what == NOTIFY_LIST_ADAPTER_WHAT) {
				// 刷新listview
				if (listViewAdapter != null) {
					listViewAdapter.notifyDataSetChanged();
				}
			}
		}
	};

	// 网格视图数据Adapter
	class GridViewAdapter extends BaseAdapter {
		private LayoutInflater layoutInflater;
		private List<PackageInfo> packageInfos;

		public GridViewAdapter(Context context, List<PackageInfo> packageInfos) {
			layoutInflater = LayoutInflater.from(context);
			this.packageInfos = packageInfos;
		}

		public int getCount() {
			return packageInfos.size();
		}

		public Object getItem(int position) {
			return packageInfos.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			View view = layoutInflater.inflate(R.layout.gridview_item, null);
			ImageView iv = (ImageView) view.findViewById(R.id.gvs_item_icon);
			TextView tv = (TextView) view.findViewById(R.id.gvs_item_appname);
			ImageView cmiv = (ImageView) view
					.findViewById(R.id.gvs_item_checkmark);
			iv.setImageDrawable(packageInfos.get(position).applicationInfo
					.loadIcon(getPackageManager()));
			tv.setText(packageInfos.get(position).applicationInfo
					.loadLabel(getPackageManager()));
			if (uninstallPositions == null) {
				cmiv.setVisibility(View.GONE);
			} else {
				for (Integer i : uninstallPositions) {
					if (position == i) {
						cmiv.setVisibility(View.VISIBLE);
					}
				}
			}
			return view;
		}
	}

	// 列表视图数据Adapter
	class ListViewAdapter extends BaseAdapter {
		private LayoutInflater layoutInflater;
		private List<PackageInfo> packageInfos;

		public ListViewAdapter(Context context, List<PackageInfo> packageInfos) {
			layoutInflater = LayoutInflater.from(context);
			this.packageInfos = packageInfos;
		}

		public int getCount() {
			return packageInfos.size();
		}

		public Object getItem(int position) {
			return packageInfos.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			View view = layoutInflater.inflate(R.layout.listview_item, null);
			ImageView iv = (ImageView) view.findViewById(R.id.lvs_item_icon);
			TextView tv_appname = (TextView) view
					.findViewById(R.id.lvs_item_appname);
			TextView tv_packagename = (TextView) view
					.findViewById(R.id.lvs_item_packagename);
			ImageView cmiv = (ImageView) view
					.findViewById(R.id.lvs_item_checkmark);
			iv.setImageDrawable(packageInfos.get(position).applicationInfo
					.loadIcon(getPackageManager()));
			tv_appname.setText(packageInfos.get(position).applicationInfo
					.loadLabel(getPackageManager()));
			tv_packagename.setText(packageInfos.get(position).packageName);
			if (uninstallPositions == null) {
				cmiv.setVisibility(View.GONE);
			} else {
				for (Integer i : uninstallPositions) {
					if (position == i) {
						cmiv.setVisibility(View.VISIBLE);
					}
				}
			}
			return view;
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 当用户点击Menu按钮
		if (keyCode == KeyEvent.KEYCODE_MENU) {
			if (navigationMenu == null) {
				initNavigationMenu();
				initSwitchMenu();
				initRunMenu();
				initSearchApplications();
			}
			if (navigationMenu.getVisibility() == View.GONE) {
				navigationMenu.setVisibility(View.VISIBLE);
			} else {
				if (searchLinearLayout != null
						&& searchLinearLayout.getVisibility() == View.VISIBLE) {
					searchEditText.setText("");
					searchLinearLayout.setVisibility(View.GONE);
				}
				navigationMenu.setVisibility(View.GONE);
			}
		}

		if (keyCode == KeyEvent.KEYCODE_Q && detailPosition != -1) {
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("选项");
			builder.setItems(R.array.operates,
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int which) {
							switch (which) {
							case 0:
								List<ResolveInfo> resolveInfoList = searchClassName(detailPosition);
								if (resolveInfoList != null
										&& resolveInfoList.size() != 0) {
									Intent intent = new Intent(
											Intent.ACTION_MAIN);
									intent
											.addCategory(Intent.CATEGORY_LAUNCHER);
									ComponentName cn = new ComponentName(
											resolveInfoList.get(0).activityInfo.packageName,
											resolveInfoList.get(0).activityInfo.name);
									intent.setComponent(cn);
									startActivity(intent);
								} else {
									Toast.makeText(MainActivity.this,
											"该应用无法运行", Toast.LENGTH_SHORT)
											.show();
								}
								break;
							case 1:
								showApplicationDetail(detailPosition);
								break;
							case 2:
								uninstallPositions = null;
								detailPosition = -1;
								uninstallApplication(currentPackageInfos
										.get(detailPosition).packageName);
								break;
							case 3:
								detailPosition = -1;
								break;
							}
						}
					});
			detailAlertDialog = builder.create();
			detailAlertDialog.show();
		}
		return super.onKeyDown(keyCode, event);
	}

	// 显示详细信息
	private void showApplicationDetail(int position) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("详细信息");
		builder.setIcon(currentAppDrawables.get(position));
		StringBuilder sb = new StringBuilder();
		sb.append("程序名称:"
				+ currentPackageInfos.get(position).applicationInfo
						.loadLabel(getPackageManager()) + "\n");
		sb.append("包名:" + currentPackageInfos.get(position).packageName + "\n");
		sb.append("版本名:" + currentPackageInfos.get(position).versionName);
		sb.append("\n版本号:" + currentPackageInfos.get(position).versionCode);
		builder.setMessage(sb.toString());
		builder.setPositiveButton("确定", null);
		builder.create().show();
	}

	// 初始化底部菜单
	private void initNavigationMenu() {
		navigationMenu = (GridView) this.findViewById(R.id.navigation_menu);
		navigationMenu.setAdapter(getMenuAdapter(navigation_item_images,
				navigation_item_texts));
		navigationMenu
				.setOnItemClickListener(new GridView.OnItemClickListener() {
					public void onItemClick(AdapterView<?> parent, View view,
							int position, long id) {
						switch (position) {
						case 0:
							if (searchLinearLayout != null
									&& searchLinearLayout.getVisibility() == View.VISIBLE) {
								searchEditText.setText("");
								searchLinearLayout.setVisibility(View.GONE);
							}
							switchDialog.show();
							break;
						case 1:
							if (searchLinearLayout != null
									&& searchLinearLayout.getVisibility() == View.VISIBLE) {
								searchEditText.setText("");
								searchLinearLayout.setVisibility(View.GONE);
							}
							runDialog.show();
							break;
						case 2:
							if (searchLinearLayout != null
									&& searchLinearLayout.getVisibility() == View.VISIBLE) {
								searchLinearLayout.setVisibility(View.GONE);
							} else {
								searchEditText.setText("");
								searchLinearLayout.setVisibility(View.VISIBLE);
							}
							break;
						case 3:
							if (searchLinearLayout != null
									&& searchLinearLayout.getVisibility() == View.VISIBLE) {
								searchEditText.setText("");
								searchLinearLayout.setVisibility(View.GONE);
							} else if (uninstallPositions == null
									|| uninstallPositions.size() == 0) {
								Toast.makeText(MainActivity.this,
										"您尚未标记任何应用,请长点击应用图标标记要删除的应用",
										Toast.LENGTH_LONG).show();
							} else {
								List<Integer> tempUninstallPositions = uninstallPositions;
								uninstallPositions = null;
								cancelFlag = true;
								for (int i = 0; i < tempUninstallPositions
										.size(); i++) {
									uninstallApplication(currentPackageInfos
											.get(tempUninstallPositions.get(i)).packageName);
								}
								navigationMenu.setVisibility(View.GONE);
							}
							break;
						case 4:
							finish();
							break;
						}
					}
				});
	}

	// 菜单数据Adapter
	private SimpleAdapter getMenuAdapter(int[] menuItemImages,
			String[] menuItemTexts) {
		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < menuItemImages.length; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("menu_item_image", menuItemImages[i]);
			map.put("menu_item_text", menuItemTexts[i]);
			data.add(map);
		}
		SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,
				data, R.layout.menu_item, new String[] { "menu_item_image",
						"menu_item_text" }, new int[] { R.id.menu_item_image,
						R.id.menu_item_text });
		return simpleAdapter;
	}

	// 初始化切换菜单Dialog
	private void initSwitchMenu() {
		LayoutInflater layoutInflater = LayoutInflater.from(this);
		switchView = layoutInflater.inflate(R.layout.switch_menu, null);
		switchDialog = new AlertDialog.Builder(this).setView(switchView)
				.create();
		switchMenu = (GridView) switchView.findViewById(R.id.switch_menu);
		switchMenu.setAdapter(getMenuAdapter(switch_menu_images,
				switch_menu_texts));
		switchMenu.setOnItemClickListener(new GridView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				switch (position) {
				case 0:
					titleTextView.setText(R.string.app_running);
					uninstallPositions = null;
					updateCurrentPackageInfosAndAppDrawables(
							runningPackageInfos, runningAppDrawables);
					switchDialog.dismiss();
					navigationMenu.setVisibility(View.GONE);
					break;
				case 1:
					titleTextView.setText(R.string.app_consum);
					uninstallPositions = null;
					updateCurrentPackageInfosAndAppDrawables(
							consumPackageInfos, consumAppDrawables);
					switchDialog.dismiss();
					navigationMenu.setVisibility(View.GONE);
					break;
				case 2:
					titleTextView.setText(R.string.app_system);
					uninstallPositions = null;
					updateCurrentPackageInfosAndAppDrawables(
							systemPackageInfos, systemAppDrawables);
					switchDialog.dismiss();
					navigationMenu.setVisibility(View.GONE);
					break;
				}
			}
		});
	}

	// 更新当前应用程序数据和应用图标数据
	private void updateCurrentPackageInfosAndAppDrawables(
			List<PackageInfo> packageInfos, List<Drawable> appDrawables) {
		currentPackageInfos = packageInfos;
		currentAppDrawables = appDrawables;
		gridViewAdapter = new GridViewAdapter(MainActivity.this,
				currentPackageInfos);
		listViewAdapter = new ListViewAdapter(MainActivity.this,
				currentPackageInfos);
		gridViewShow.setAdapter(gridViewAdapter);
		listViewShow.setAdapter(listViewAdapter);
		imageSwitcher.setImageDrawable(null);
		gallery.setAdapter(new ImageAdapter(this, currentAppDrawables));
		gallery.setSelection(currentAppDrawables.size() / 2);
	}

	// 初始化运行菜单Dialog
	private void initRunMenu() {
		LayoutInflater layoutInflater = LayoutInflater.from(this);
		runView = layoutInflater.inflate(R.layout.gallery_image_switcher, null);
		runDialog = new AlertDialog.Builder(this).setView(runView).setTitle(
				"请选择要运行的应用程序").setPositiveButton("确定",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						if (appDrawablePosition == 0) {
							Toast.makeText(MainActivity.this, "您未选择要运行的程序",
									Toast.LENGTH_SHORT).show();
						} else {
							List<ResolveInfo> resolveInfoList = searchClassName(appDrawablePosition);
							if (resolveInfoList != null
									&& resolveInfoList.size() != 0) {
								Intent intent = new Intent(Intent.ACTION_MAIN);
								intent.addCategory(Intent.CATEGORY_LAUNCHER);
								ComponentName cn = new ComponentName(
										resolveInfoList.get(0).activityInfo.packageName,
										resolveInfoList.get(0).activityInfo.name);
								intent.setComponent(cn);
								startActivity(intent);
								navigationMenu.setVisibility(View.GONE);
							} else {
								Toast.makeText(MainActivity.this, "该应用无法运行",
										Toast.LENGTH_SHORT).show();
							}
						}
					}
				}).setNegativeButton("取消",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						runDialog.dismiss();
						navigationMenu.setVisibility(View.GONE);
					}
				}).create();
		imageSwitcher = (ImageSwitcher) runView
				.findViewById(R.id.imageSwitcherId);
		imageSwitcher.setFactory(new ImageViewFactory(this));
		// 动画效果
		imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
				android.R.anim.fade_in));
		imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
				android.R.anim.fade_out));
		gallery = (Gallery) runView.findViewById(R.id.galleryId);
		gallery.setAdapter(new ImageAdapter(this, currentAppDrawables));
		// 默认选中位置
		gallery.setSelection(currentAppDrawables.size() / 2);
		gallery.setOnItemClickListener(new Gallery.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				appDrawablePosition = position;
				imageSwitcher.setImageDrawable(currentAppDrawables
						.get(position));
			}
		});
	}

	// Gallery数据
	class ImageAdapter extends BaseAdapter {
		private Context context;
		private List<Drawable> appDrawables;

		public ImageAdapter(Context context, List<Drawable> appDrawables) {
			this.context = context;
			this.appDrawables = appDrawables;
		}

		public int getCount() {
			return appDrawables.size();
		}

		public Object getItem(int position) {
			return appDrawables.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView iv = new ImageView(context);
			iv.setImageDrawable(appDrawables.get(position));
			// 是否保持宽高比
			iv.setAdjustViewBounds(true);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setPadding(15, 10, 15, 10);
			return iv;
		}
	}

	// ImageSwitcher工厂
	class ImageViewFactory implements ViewSwitcher.ViewFactory {
		private Context context;

		public ImageViewFactory(Context context) {
			this.context = context;
		}

		public View makeView() {
			ImageView iv = new ImageView(context);
			iv.setLayoutParams(new ImageSwitcher.LayoutParams(90, 90));
			return iv;
		}
	}

	// 查找应用的启动Activity名称
	private List<ResolveInfo> searchClassName(int position) {
		Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
		resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
		resolveIntent.setPackage(currentPackageInfos.get(position).packageName);
		List<ResolveInfo> resolveInfoList = getPackageManager()
				.queryIntentActivities(resolveIntent, 0);
		return resolveInfoList;
	}

	// 查询应用程序
	private void initSearchApplications() {
		searchEditText.addTextChangedListener(new TextWatcher() {
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
				String condition = s.toString();
				if (condition.equals("")) {
					gridViewShow.setAdapter(new GridViewAdapter(
							MainActivity.this, currentPackageInfos));
					listViewShow.setAdapter(new ListViewAdapter(
							MainActivity.this, currentPackageInfos));
				}
				List<PackageInfo> tempPackageInfos = new ArrayList<PackageInfo>();
				String str = null;
				for (int i = 0; i < currentPackageInfos.size(); i++) {
					str = (String) currentPackageInfos.get(i).applicationInfo
							.loadLabel(getPackageManager());
					if (str.toLowerCase().contains(condition)) {
						tempPackageInfos.add(currentPackageInfos.get(i));
					}
				}
				gridViewShow.setAdapter(new GridViewAdapter(MainActivity.this,
						tempPackageInfos));
				listViewShow.setAdapter(new ListViewAdapter(MainActivity.this,
						tempPackageInfos));
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void afterTextChanged(Editable s) {
			}
		});
	}

	// 卸载程序
	private void uninstallApplication(String packageName) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_DELETE);
		intent.setData(Uri.parse("package:" + packageName));
		startActivity(intent);
	}

	// 监听程序是否卸载
	class UninstallReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			cancelFlag = false;
			String packageName = intent.getDataString();
			uninstallData(currentPackageInfos, currentAppDrawables, packageName);
			uninstallData(systemPackageInfos, systemAppDrawables, packageName);
			uninstallData(consumPackageInfos, consumAppDrawables, packageName);
			uninstallData(runningPackageInfos, runningAppDrawables, packageName);
			updateCurrentPackageInfosAndAppDrawables(currentPackageInfos,
					currentAppDrawables);
		}
	}

	// 同步数据
	private void uninstallData(List<PackageInfo> packageInfos,
			List<Drawable> appDrawables, String packageName) {
		for (int i = 0; i < packageInfos.size(); i++) {
			if (packageName.equals("package:"
					+ packageInfos.get(i).applicationInfo.packageName)) {
				packageInfos.remove(i);
				appDrawables.remove(i);
			}
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 如果全部取消卸载,刷新数据
		if (cancelFlag) {
			cancelFlag = false;
			updateCurrentPackageInfosAndAppDrawables(currentPackageInfos,
					currentAppDrawables);
		}
	}

	// 退出软件(回收资源)
	@Override
	protected void onDestroy() {
		if (pd != null) {
			pd = null;
		}
		if (titleTextView != null) {
			titleTextView = null;
		}
		if (viewImageButton != null) {
			viewImageButton = null;
		}
		if (gridViewShow != null) {
			gridViewShow = null;
		}
		if (listViewShow != null) {
			listViewShow = null;
		}
		if (gridViewAdapter != null) {
			gridViewAdapter = null;
		}
		if (listViewAdapter != null) {
			listViewAdapter = null;
		}
		if (navigationMenu != null) {
			navigationMenu = null;
		}
		if (switchMenu != null) {
			switchMenu = null;
		}
		if (switchView != null) {
			switchView = null;
		}
		if (switchDialog != null) {
			switchDialog = null;
		}
		if (runView != null) {
			runView = null;
		}
		if (runDialog != null) {
			runDialog = null;
		}
		if (gallery != null) {
			gallery = null;
		}
		if (imageSwitcher != null) {
			imageSwitcher = null;
		}
		if (searchLinearLayout != null) {
			searchLinearLayout = null;
		}
		if (searchEditText != null) {
			searchEditText = null;
		}
		if (uninstallPositions != null) {
			uninstallPositions = null;
		}
		if (uninstallReceiver != null) {
			uninstallReceiver = null;
		}
		if (detailAlertDialog != null) {
			detailAlertDialog = null;
		}
		if (currentPackageInfos != null) {
			currentPackageInfos = null;
		}
		if (systemPackageInfos != null) {
			systemPackageInfos = null;
		}
		if (consumPackageInfos != null) {
			consumPackageInfos = null;
		}
		if (runningPackageInfos != null) {
			runningPackageInfos = null;
		}
		if (currentAppDrawables != null) {
			currentAppDrawables = null;
		}
		if (systemAppDrawables != null) {
			systemAppDrawables = null;
		}
		if (consumAppDrawables != null) {
			consumAppDrawables = null;
		}
		if (runningAppDrawables != null) {
			runningAppDrawables = null;
		}
		if (navigation_item_images != null) {
			navigation_item_images = null;
		}
		if (navigation_item_texts != null) {
			navigation_item_texts = null;
		}
		if (switch_menu_images != null) {
			switch_menu_images = null;
		}
		if (switch_menu_texts != null) {
			switch_menu_texts = null;
		}
		// 注销卸载监听器
		MainActivity.this.unregisterReceiver(uninstallReceiver);
		super.onDestroy();
	}
}

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
    >
    <!-- 
    	标题栏
     -->
    <RelativeLayout
    	android:layout_width="fill_parent"
    	android:layout_height="25px"
    	android:gravity="center_vertical"
    	android:paddingLeft="5px"
    	android:paddingRight="5px"
    	android:paddingTop="3px"
    	android:background="@drawable/title_bg"
    	>
    	<ImageView
    		android:id="@+id/titleImage"
    		android:layout_width="18px"
    		android:layout_height="18px"
    		android:src="@drawable/app_icon"
    		/>
    	<TextView
    		android:id="@+id/titleText"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:textColor="#000"
    		android:textSize="15px"
    		android:text="@string/app_system"
    		android:layout_marginLeft="6px"
    		android:layout_toRightOf="@id/titleImage"
    		/>
    	<ImageButton
    		android:id="@+id/viewImageButton"
    		android:layout_width="25px"
    		android:layout_height="25px"
    		android:layout_alignParentRight="true"
    		android:src="@drawable/b_list_view"
    		/>	
    </RelativeLayout>
    
    <!-- 
    	网格方式显示
     -->
    <GridView
    	android:id="@+id/gridViewShow"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:listSelector="@drawable/choose_gridview"
    	android:horizontalSpacing="10px"
    	android:verticalSpacing="10px"
    	android:numColumns="3"
   		android:layout_marginTop="28px"
   		android:layout_marginBottom="12px"
   		android:layout_marginLeft="5px"
   		android:layout_marginRight="5px"
    	/>
    
    <!-- 
    	列表方式显示
     -->
 	<ListView
 		android:id="@+id/listViewShow"
 		android:layout_width="fill_parent"
 		android:layout_height="fill_parent"
 		android:listSelector="@drawable/choose_listview"
 		android:layout_marginTop="28px"
   		android:layout_marginBottom="12px"
   		android:layout_marginLeft="5px"
   		android:layout_marginRight="5px"
   		android:visibility="gone"
 		/> 	
    
    <!-- 
    	底部菜单
    	默认不可见
     -->
	<GridView
		android:id="@+id/navigation_menu"
		android:layout_width="fill_parent"
		android:layout_height="65px"
		android:background="@drawable/navigation_bg"
		android:layout_alignParentBottom="true"
		android:numColumns="5"
		android:gravity="center"
		android:horizontalSpacing="10px"
		android:verticalSpacing="10px"
		android:visibility="gone"
		/>
	
	<!-- 
		查询框
	 -->
	<LinearLayout
		android:id="@+id/searchLinearLayout"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:layout_centerVertical="true"
		android:layout_alignParentLeft="true"
		android:layout_above="@id/navigation_menu"
		android:visibility="gone"
		>
		<EditText
			android:id="@+id/searchEditText"
			android:layout_width="fill_parent"
			android:layout_height="wrap_content"
			android:hint="@string/search_hint"
			android:textSize="18px"		
			/>
	</LinearLayout>	
</RelativeLayout>

 

menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
  	android:layout_height="fill_parent"
  	>
  	<ImageView
  		android:id="@+id/menu_item_image"
  		android:layout_width="wrap_content"
  		android:layout_height="wrap_content"
  		android:layout_centerHorizontal="true"
  		/>
  	<TextView
  		android:id="@+id/menu_item_text"
  		android:layout_width="wrap_content"
  		android:layout_height="wrap_content"
  		android:layout_centerHorizontal="true"
  		android:layout_below="@id/menu_item_image"
  		/>	
</RelativeLayout>

 

gridview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  	android:layout_width="90px"
  	android:layout_height="wrap_content"
  	android:orientation="vertical"
  	android:gravity="center"
  	>
  	<ImageView 
  		android:id="@+id/gvs_item_icon"
  		android:layout_width="64px"
  		android:layout_height="64px"
  		/>
  	<TextView
  		android:id="@+id/gvs_item_appname"
  		android:layout_width="wrap_content"
  		android:layout_height="wrap_content"
  		android:lines="2"
  		android:textSize="16px"
  		android:textColor="#fff"
  		android:gravity="center"
  		/>	
  	<ImageView
  		android:id="@+id/gvs_item_checkmark"
  		android:layout_width="18px"
  		android:layout_height="18px"
  		android:src="@drawable/checkmark"
  		android:visibility="gone"
  		/>
</LinearLayout>

 

listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  	android:layout_width="fill_parent"
  	android:layout_height="wrap_content"
  	android:gravity="center_vertical"
  	>
  	<ImageView
  		android:id="@+id/lvs_item_icon"
  		android:layout_width="48px"
  		android:layout_height="48px"
  		android:layout_marginTop="5px"
  		android:layout_marginBottom="5px"
  		/>
  	<LinearLayout
  		android:layout_width="wrap_content"
  		android:layout_height="48px"
  		android:orientation="vertical"
  		android:paddingLeft="5px"
  		android:layout_toRightOf="@id/lvs_item_icon"
  		>
  		<TextView
  			android:id="@+id/lvs_item_appname"
  			android:layout_width="wrap_content"
  			android:layout_height="wrap_content"
  			android:singleLine="true"
  			android:textSize="16px"
  			android:textStyle="bold"
  			android:textColor="#fff"
  			/>
  		<TextView
  			android:id="@+id/lvs_item_packagename"
  			android:layout_width="wrap_content"
  			android:layout_height="wrap_content"
  			android:singleLine="true"
  			android:textColor="#fff"
  			/>
  	</LinearLayout>
  	<ImageView
  		android:id="@+id/lvs_item_checkmark"
  		android:layout_width="25px"
  		android:layout_height="25px"
  		android:layout_alignParentRight="true"
  		android:layout_marginTop="20px"
  		android:layout_marginRight="5px"
  		android:src="@drawable/checkmark"
  		android:visibility="gone"
  		/>
</RelativeLayout>

 

switch_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
  	android:layout_height="fill_parent"
  	>
  	<!-- 
  		android:stretchMode="columnWidth"
  		根据列宽自动缩放
  	 -->
  	<GridView
  		android:id="@+id/switch_menu"
  		android:layout_width="fill_parent"
  		android:layout_height="fill_parent"
  		android:numColumns="3"
  		android:horizontalSpacing="10px"
		android:verticalSpacing="10px"
		android:stretchMode="columnWidth"
		android:gravity="center"
  		/>
</LinearLayout>

 

gallery_image_switcher.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  	android:layout_width="fill_parent"
  	android:layout_height="fill_parent"
  	>
  	<Gallery
  		android:id="@+id/galleryId"
  		android:layout_width="fill_parent"
  		android:layout_height="110px"
  		android:layout_marginTop="10px"
  		android:layout_alignParentLeft="true"
  		/>
  	<ImageSwitcher
  		android:id="@+id/imageSwitcherId"
  		android:layout_width="90px"
  		android:layout_height="90px"
  		android:layout_alignParentTop="true"
  		android:layout_centerHorizontal="true"
  		android:layout_marginTop="10px"
  		android:layout_alignBottom="@id/galleryId"
  		/>	
</RelativeLayout>

 

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="app_name">应用程序管理器</string>
	<string name="app_running">正在运行的应用程序</string>
	<string name="app_consum">用户安装的应用程序</string>
	<string name="app_system">系统全部的应用程序</string>
	<string name="grid_view">网格视图</string>
	<string name="list_view">列表视图</string>
	<string name="search_hint">请输入您要查找的应用名称</string>
	<string-array name="operates">
		<item>运行程序</item>
		<item>详细信息</item>
		<item>卸载程序</item>
		<item>返回</item>
	</string-array>
</resources>

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="org.wp.activity" android:versionCode="1" android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".MainActivity" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<uses-sdk android:minSdkVersion="9" />
</manifest>

  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值