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>