1.使用packagemanager这个管理包的工具类得到所有的安装包的信息,并把这些安装包的信息以listview的方式展示出来。
package com.luochuang.bean;
import android.graphics.drawable.Drawable;
public class appinfo {
private String packageName;
private String version;
private Drawable appicon;
private boolean isSystem;
private String appName;
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public Drawable getAppicon() {
return appicon;
}
public void setAppicon(Drawable appicon) {
this.appicon = appicon;
}
public boolean isSystem() {
return isSystem;
}
public void setSystem(boolean isSystem) {
this.isSystem = isSystem;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
}
得到所有的程序的信息的集合;
package com.luochuang.packager;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import com.luochuang.bean.appinfo;
public class GetPackAge {
private Context context;
private PackageManager pm;
public GetPackAge(Context context) {
this.context = context;
pm = context.getPackageManager();
}
public List<appinfo> getappinfo() throws Exception {
List<PackageInfo> infos = pm
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
List<appinfo> appinfos = new ArrayList<appinfo>();
for (PackageInfo info : infos) {
appinfo app = new appinfo();
// packagename
String packname = info.packageName;
app.setPackageName(packname);
// appname
String appname = info.applicationInfo.loadLabel(pm).toString();
app.setAppName(appname);
// icon
Drawable appicon = info.applicationInfo.loadIcon(pm);
app.setAppicon(appicon);
// version
String appversion = info.versionName;
app.setVersion(appversion);
ApplicationInfo appinfo = pm.getPackageInfo(packname, 0).applicationInfo;
if (filterApp(appinfo)) {
app.setSystem(true);
} else {
app.setSystem(false);
}
appinfos.add(app);
app = null;
}
return appinfos;
}
/***
* 判断一个应用是否是第三方应用
*/
public boolean filterApp(ApplicationInfo info) {
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
return true;
} else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
return true;
}
return false;
}
}
填充到listview中。
package com.luochuang.packager;
import java.util.ArrayList;
import java.util.List;
import com.luochuang.bean.appinfo;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.ScaleAnimation;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
@SuppressWarnings("unused")
public class PackageManagerTestActivity extends Activity implements
OnClickListener {
private boolean flag = true;
private ListView lv_app_manager;
protected static final int LOAD_FINISH = 60;
private LinearLayout ll_app_manager_loading;
appinfo info;
private myadapter adapter;
private GetPackAge packager;
private List<appinfo> userinfo;
PopupWindow popup = null;
// 运行卸载和分享
int currentnumber;
private LinearLayout ll_uninstall;
private LinearLayout ll_start;
private LinearLayout ll_share;
List<appinfo> infos = new ArrayList<appinfo>();
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ll_app_manager_loading.setVisibility(View.INVISIBLE); // 隐藏掉加载界面
adapter = new myadapter();
lv_app_manager.setAdapter(adapter);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv_app_manager = (ListView) findViewById(R.id.lv_app_manager);
ll_app_manager_loading = (LinearLayout) findViewById(R.id.ll_app_manager_loading);
inflate();
lv_app_manager.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
dismisspopupWindow();
// 在显示新的窗体之前,关闭掉已经有的窗体
// TextView textview = new TextView(getApplicationContext());
// appinfo appinfo = (appinfo) lv_app_manager
// .getItemAtPosition(position);
// textview.setText(appinfo.getAppName());
// textview.setTextColor(Color.RED);
// String name;
currentnumber = position;
System.out.println(position);
View contentview = View.inflate(getApplicationContext(),
R.layout.app_popup_item, null);
ScaleAnimation sa = new ScaleAnimation(0.2f, 0.8f, 0.3f, 1.0f);
sa.setDuration(800);
// 指定popupwindow的长度和宽度
popup = new PopupWindow(contentview, 210, 80);
int[] location = new int[2];
view.getLocationInWindow(location);
// 对于popupwindow必须指定一个背景,否则会报出各种错误,在这里设置为透明
popup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
popup.showAtLocation(parent, Gravity.TOP | Gravity.LEFT,
location[0] + 60, location[1]);
contentview.startAnimation(sa);
// 启动分享和卸载
ll_uninstall = (LinearLayout) contentview
.findViewById(R.id.ll_app_manager_popup_uninstall);
ll_start = (LinearLayout) contentview
.findViewById(R.id.ll_app_manager_popup_start);
ll_share = (LinearLayout) contentview
.findViewById(R.id.ll_app_manager_popup_share);
ll_uninstall
.setOnClickListener(PackageManagerTestActivity.this);
ll_start.setOnClickListener(PackageManagerTestActivity.this);
ll_share.setOnClickListener(PackageManagerTestActivity.this);
}
});
lv_app_manager.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
dismisspopupWindow();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
dismisspopupWindow();
}
});
}
public void dismisspopupWindow() {
if (popup != null && popup.isShowing()) {
popup.dismiss();
popup = null;
}
}
/***
* 填充用户的数据
*
* @author Administrator
*
*/
public void inflate() {
// 设置加载不可见
ll_app_manager_loading.setVisibility(View.VISIBLE);
new Thread() {
public void run() {
packager = new GetPackAge(PackageManagerTestActivity.this);
try {
infos = packager.getappinfo();
} catch (Exception e) {
e.printStackTrace();
}
// Message msg = new Message();
handler.sendEmptyMessage(0);
// 初始化用户信息
initUserPackInfos();
};
}.start();
}
public class myadapter extends BaseAdapter {
@Override
public int getCount() {
if (flag) {
return infos.size();
} else {
return userinfo.size();
}
}
@Override
public Object getItem(int position) {
if (flag) {
return infos.get(position);
} else {
return userinfo.get(position);
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
currentnumber = position;
holder holder = new holder();
View view;
if (convertView == null) {
view = View.inflate(PackageManagerTestActivity.this,
R.layout.packager_manager_item, null);
holder.iv_app_manager_item_icon = (ImageView) view
.findViewById(R.id.iv_app_manager_item_icon);
holder.tv_app_manager_item_name = (TextView) view
.findViewById(R.id.tv_app_manager_item_name);
holder.tv_app_manager_item_version = (TextView) view
.findViewById(R.id.tv_app_manager_item_version);
view.setTag(holder);
} else {
view = convertView;
holder = (holder) view.getTag();
}
info = new appinfo();
if (flag) {
info = infos.get(position);
} else {
info = userinfo.get(position);
}
holder.iv_app_manager_item_icon.setImageDrawable(info.getAppicon());
holder.tv_app_manager_item_name.setText(info.getAppName());
holder.tv_app_manager_item_version.setText(info.getVersion());
return view;
}
}
public static class holder {
ImageView iv_app_manager_item_icon;
TextView tv_app_manager_item_name;
TextView tv_app_manager_item_version;
}
/**
* 在用户程序和系统程序之间进行切换
*/
public void click(View view) {
TextView textview = (TextView) view;
if (flag) {
textview.setText("用户程序");
initUserPackInfos();
adapter.notifyDataSetChanged();
flag = false;
} else {
textview.setText("所有程序");
adapter.notifyDataSetChanged();
flag = true;
}
}
/**
* 得到所有的用户信息
*/
public void initUserPackInfos() {
userinfo = new ArrayList<appinfo>();
for (appinfo app : infos) {
if (app.isSystem()) {
userinfo.add(app);
}
}
}
public void onClick(View v) {
info = (appinfo) lv_app_manager.getItemAtPosition(currentnumber);
switch (v.getId()) {
case R.id.ll_app_manager_popup_start:
// System.out.println("ddd"+info.getVersion());
getStart(info);
break;
case R.id.ll_app_manager_popup_share:
// System.out.println("ddd"+info.getPackageName());
break;
case R.id.ll_app_manager_popup_uninstall:
// System.out.println("ddd"+info.getPackageName());
uninstall(info);
break;
}
}
/**
* 为防止窗口泄露的问题出现,在这里要对popup进行销毁
*/
@Override
protected void onDestroy() {
dismisspopupWindow();
super.onDestroy();
}
/**
* 开启一个应用程序
*/
public void getStart(appinfo info) {
PackageManager pm = getPackageManager();
PackageInfo infos;
try {
infos = pm.getPackageInfo(info.getPackageName(),
PackageManager.GET_ACTIVITIES);
ActivityInfo[] activityinfos = infos.activities;
if (activityinfos != null && activityinfos.length > 0) {
ActivityInfo lunchActivity = activityinfos[0];
Intent intent = new Intent();
intent.setClassName(info.getPackageName(), lunchActivity.name);
startActivity(intent);
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
/**
* 卸载应用
*/
public void uninstall(appinfo info) {
if (info.isSystem()) {
Uri packageUri = Uri.parse("package:" + info.getPackageName());
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,
packageUri);
startActivityForResult(uninstallIntent, 0);
} else {
Toast.makeText(this, "系统应用不能被卸载", 0).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
inflate();
super.onActivityResult(requestCode, resultCode, data);
}
}