android uninstall小工具demo实现

package com.jf.install;

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

import com.jf.install.util.ViewHandler;

import android.R.integer;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity
{
	ListView lv;
	ListAdapter adapter;
	ArrayList< HashMap< String , Object >> items;
	private static final int INSTALL = 1;
	private InstallThread installThread;
	private InstallHandle installHandle;
	private LinearLayout mLoad;
	long i , j = 0;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		ViewHandler.creteProgressDialog(this, "Loading");
		lv = (ListView) findViewById(R.id.applist);
		installThread = new InstallThread();
		installHandle = new InstallHandle();
		new Thread(installThread).start();
	}

	private void refresh()
	{

		/**
		 * 参数:Context ArrayList(item的集合) item的layout 包含ArrayList中的HashMap的key的数组
		 * key所对应的值的相应的控件id
		 */
		adapter = new ListAdapter(this, items, R.layout.piitem, new String[]
		{ "icon" , "appName" , "packageName" }, new int[]
		{ R.id.icon , R.id.appName , R.id.packageName });
		lv.setAdapter(adapter);
		lv.setOnItemClickListener(new InstallListener());
	}

	private void iSearchPackage()
	{
		// 得到PackageManager对象
		i = System.currentTimeMillis();
		System.out.println("begion:" + i);
		PackageManager pm = getPackageManager();
		// 得到系统安装的所有程序包的PackageInfo对象
		// List<ApplicationInfo> packs = pm.getInstalledApplications(0);
		List< PackageInfo > packs = pm.getInstalledPackages(0);
		items = new ArrayList< HashMap< String , Object >>();
		for (PackageInfo pi : packs)
		{
			HashMap< String , Object > map = new HashMap< String , Object >();
			// 显示用户安装的应用程序,而不显示系统程序
			if (( pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM ) == 0 && ( pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP ) == 0)
			{
				// 这将会显示所有安装的应用程序,包括系统应用程序
				map.put("icon", pi.applicationInfo.loadIcon(pm));// 图标
				map.put("appName", pi.applicationInfo.loadLabel(pm));// 应用程序名称
				map.put("packageName", pi.applicationInfo.packageName);// 应用程序包名
				// 循环读取并存到HashMap中,再增加到ArrayList上,一个HashMap就是一项
				items.add(map);
			}
		}
		j = System.currentTimeMillis();
		System.out.println("运行时间:" + ( j - i ));
	}

	@Override
	protected void onDestroy()
	{
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("onDestroy");
	}

	@Override
	protected void onPause()
	{
		// TODO Auto-generated method stub
		super.onPause();
		System.out.println("onPause");
	}

	@Override
	protected void onRestart()
	{
		// TODO Auto-generated method stub
		super.onRestart();
		new Thread(installThread).start();
		ViewHandler.creteProgressDialog(this, "Loading");
		System.out.println("onRestart");
	}

	@Override
	protected void onResume()
	{
		// TODO Auto-generated method stub
		super.onResume();
		System.out.println("onResume");
	}

	@Override
	protected void onStart()
	{
		// TODO Auto-generated method stub
		super.onStart();
		System.out.println("onStart");
	}

	@Override
	protected void onStop()
	{
		// TODO Auto-generated method stub
		super.onStop();
		System.out.println("onStop");
	}

	class InstallHandle extends Handler
	{

		@Override
		public void handleMessage(Message msg)
		{
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			if (msg.what == INSTALL)
			{
				refresh();
				ViewHandler.dissMiss();

			}
		}

	}

	class InstallThread extends Thread
	{
		public void run()
		{
			iSearchPackage();
			installHandle.sendEmptyMessage(INSTALL);
		}
	}

	class InstallListener implements OnItemClickListener
	{

		@Override
		public void onItemClick(AdapterView< ? > arg0 , View arg1 , int arg2 , long arg3)
		{
			// TODO Auto-generated method stub
			System.out.println(arg2);
			Uri packageURI = Uri.parse("package:" + items.get(arg2).get("packageName"));
			Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
			startActivity(uninstallIntent);

		}

	}
}

 

package com.jf.install;

import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.SimpleAdapter.ViewBinder;

public class ListAdapter extends SimpleAdapter
{
	private int[] appTo;
	private String[] appFrom;
	private ViewBinder appViewBinder;
	private List<? extends Map<String, ?>>  appData;
	private int appResource;
	private LayoutInflater appInflater;
	private Context context;
	public ListAdapter(Context context, List<? extends Map<String, ?>> data,
			int resource, String[] from, int[] to) {
		super(context, data, resource, from, to);
		appData = data;
		appResource = resource;
		appFrom = from;
		appTo = to;
		appInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	public View getView(int position, View convertView, ViewGroup parent)
	{
		return createViewFromResource(position, convertView, parent, appResource);
		
	}
	
	private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource)
	{
		View v;
		if(convertView == null)
		{
			v = appInflater.inflate(resource, parent,false);
			final int[] to = appTo;
			final int count = to.length;
			final View[] holder = new View[count];
			
			for(int i = 0; i < count; i++)
			{
				holder[i] = v.findViewById(to[i]);
			}
			v.setTag(holder);
		}else
		{
			v = convertView;
		}
		bindView(position, v);
		return v;	
	}
	
	private void bindView(int position, View view)
	{
		final Map dataSet = appData.get(position);
		if(dataSet == null)
		{
			return;
		}
		
		final ViewBinder binder = appViewBinder;
		final View[] holder = (View[])view.getTag();
		final String[] from = appFrom;
		final int[] to = appTo;
		final int count = to.length;
		
		for(int i = 0; i < count; i++)
		{
			final View v = holder[i];
			if(v != null)
			{
				final Object data = dataSet.get(from[i]);
				String text = data == null ? "":data.toString();
				if(text == null)
				{
					text = "";
				}
				
				boolean bound = false;
				if(binder != null)
				{
					bound = binder.setViewValue(v, data, text);
				}
				
				if(!bound)
				{
					/**
					 * 自定义适配器,关在在这里,根据传递过来的控件以及值的数据类型,
					 * 执行相应的方法,可以根据自己需要自行添加if语句。另外,CheckBox等
					 * 集成自TextView的控件也会被识别成TextView,这就需要判断值的类型
					 */
					if(v instanceof TextView)
					{
						//如果是TextView控件,则调用SimpleAdapter自带的方法,设置文本
						this.setViewText((TextView)v, text);
					}else if(v instanceof ImageView)
					{
						//如果是ImageView控件,调用自己写的方法,设置图片
						setViewImage((ImageView)v, (Drawable)data);
					}else
					{
						throw new IllegalStateException(v.getClass().getName() + " is not a " +
								"view that can be bounds by this SimpleAdapter");
					}
				}
			}
		}
	}
	public void setViewImage(ImageView v, Drawable value)
	{
		v.setImageDrawable(value);
	}
}

 

下面的2个是自定义的加载框:

package com.jf.install.util;


import com.jf.install.R;

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ViewHandler {
	 static ProgressDialog dlg ;
	public static ProgressDialog creteProgressDialog(Context context,
			String text) {
		dlg= new ProgressDialog(context);
		dlg.show();
		dlg.setContentView(R.layout.loading);
		LinearLayout root = (LinearLayout) dlg
				.findViewById(R.id.progressDialog);
		root.setGravity(android.view.Gravity.CENTER);

		LoadingView mLoadView = new LoadingView(context);
		mLoadView.setDrawableResId(R.drawable.icon10);
		root.addView(mLoadView);
		TextView alert = new TextView(context);   
		Paint tPaint=alert.getPaint();
	     tPaint.setFakeBoldText(true);
		alert.setText(text);
		alert.setTextSize(18);
		
	//	alert.setTextColor(R.drawable.red);
		root.addView(alert);
		return dlg;
	}
	  public static void distoryBitmap(Bitmap mFgBitmap){  

		      if ( null !=mFgBitmap&&!mFgBitmap.isRecycled())  

		    	  mFgBitmap.recycle();   
		 }  
	public static void dissMiss(){
		if(null!=dlg){
			System.out.println("dialog dismiss***********************");
			dlg.dismiss();
		}
	}
}

 

package com.jf.install.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;

public class LoadingView extends View {

	private Matrix mFgMatrix;
	private Bitmap mFgBitmap;

	public LoadingView(Context context) {
		super(context);
	}

	public LoadingView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public void setDrawableResId(int iconResId) {
		mFgMatrix = new Matrix();
		mFgBitmap = BitmapFactory.decodeResource(getResources(), iconResId);
		myHandler.sendEmptyMessage(0);
		onMeasure(mFgBitmap.getWidth(), mFgBitmap.getHeight());
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(mFgBitmap.getWidth(), mFgBitmap.getHeight());
	}

	@Override
	protected void onDraw(Canvas canvas) {
		canvas.drawBitmap(mFgBitmap, mFgMatrix, null);
	}

	private Handler myHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			mFgMatrix.postRotate(-10f, mFgBitmap.getWidth() / 2f, mFgBitmap
					.getHeight() / 2f);
			invalidate();
			myHandler.sendEmptyMessageDelayed(msg.what, 20);
		};
	};
}

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="wrap_content"
	android:layout_height="wrap_content" android:id="@+id/progressDialog">
</LinearLayout>

 

<?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:orientation="vertical" >

    <ListView
        android:id="@+id/applist"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<ImageView android:id="@+id/icon" 
	    android:layout_width="48dip"
		android:layout_height="48dip" 
		android:padding="4dip" />
	<LinearLayout android:orientation="vertical"
		android:layout_width="fill_parent" android:layout_height="wrap_content">
		<TextView android:id="@+id/appName" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
		<TextView android:id="@+id/packageName" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
	</LinearLayout>
</LinearLayout>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值