软件管理器的实现

     
1.首先看看布局softappshow.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" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:background="@drawable/item_bg"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingLeft="5px" >

        <ImageView
            android:layout_width="30px"
            android:layout_height="20px"
            android:src="@drawable/manage" />



        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="管理应用程序"
            android:textSize="15px" />
    </LinearLayout>

    <GridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="40px"
       android:layout_marginTop="30px"
        android:horizontalSpacing="10px"
        android:layoutAnimation="@anim/layout1"
        android:listSelector="@drawable/choose_gridview"
        android:numColumns="3"
        android:background="@drawable/bg"
        android:verticalSpacing="10px" />

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="40px"
        android:layout_marginTop="30px"
        android:layoutAnimation="@anim/layout1"
        android:listSelector="@drawable/choose_listview"
         android:background="@drawable/item_bg"
        android:visibility="gone" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="40px"
        android:layout_alignParentBottom="true"
        android:background="@drawable/item_bg" >

        <ImageButton
            android:id="@+id/changeview"
            android:layout_width="50px"
            android:layout_height="40px"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="5px"
            android:src="@drawable/grids" />

        <ImageButton
            android:id="@+id/softwaremanger"
            android:layout_width="50px"
            android:layout_height="40px"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5px"
            android:src="@drawable/all" />
    </RelativeLayout>

</RelativeLayout>


2.接着看看grid_app.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:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/grid_item"
        android:layout_width="60dp"
        android:layout_height="60dp"
         />
    <TextView
        android:id="@+id/gridname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:lines="2"
        android:textColor="#FF6100"
        android:textSize="15px"
         />

</LinearLayout>

3.再接着是list_app.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="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    >
    
    
    <ImageView
        android:id="@+id/listimage"
        android:layout_width="50px"
        android:layout_height="50px"
        android:layout_marginBottom="5px"
        android:layout_marginTop="5px"
        />
    <LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="50px"
    android:orientation="vertical"
    android:layout_marginLeft="5px"
    >
    <TextView 
        android:id="@+id/listname"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textColor="#FF6100"
        android:textSize="15px"
        android:textStyle="bold"
        />

    <TextView 
        android:id="@+id/listpackgename"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textColor="#FF6100"
        
        />
</LinearLayout>
</LinearLayout>
4.然后呢,就可以看卡主活动的实现过程 SoftwareManagerActivity.java
package com.wang;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
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.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.LayoutAnimationController;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class SoftwareManagerActivity extends Activity implements Runnable,
		OnItemClickListener {

	// 常量
	private static final int SEARCH = 0;
	private static final int DELETE = 1;

	GridView gridView;
	ListView listView;

	// 取得系统中所有的包的信息 PackageInfo
	private List<PackageInfo> packageInfos;
	private List<PackageInfo> userInfos;
	private List<PackageInfo> showInfos;

	private ProgressDialog progressDialog;
	ImageButton softwaremanger;
	ImageButton changeView;

	private boolean allapp = true;
	private boolean islistview = false;

	/**
	 * 用handler实现异步加载功能 实现不同线程之间的通信
	 **/

	// 异步加载声明一个个handler对象
	private Handler myhHandler = new Handler() {

		// 子类必须实现这个接收消息
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			// 判断接受的信息
			if (msg.what == SEARCH) {
				showInfos = packageInfos;
				// GridViewAdapter 和ListViewAdapter风别调用下面的方法
				gridView.setAdapter(new GridViewAdapter(
						SoftwareManagerActivity.this, showInfos));
				listView.setAdapter(new ListViewAdapter(
						SoftwareManagerActivity.this, showInfos));
				// 隐藏进度对话框
				progressDialog.dismiss();
				// 设置为不可见
				setProgressBarIndeterminateVisibility(false);

			}
			if (msg.what == DELETE) {
				System.out.println("删除成功!!!");
			}

		};
	};

	public void onCreate(Bundle savedInstanceState) {
		// 取消标题
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 取消状态栏,充满全屏
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		super.onCreate(savedInstanceState);

		setContentView(R.layout.softappshow);

		// 设置进度对话框为可见
		setProgressBarIndeterminateVisibility(true);

		// 调用动画的淡入淡出的效果
		AnimationSet animationSet = new AnimationSet(false);
		Animation animation = new AlphaAnimation(0, 1);
		animation.setDuration(500);
		animationSet.addAnimation(animation);

		// 调用动画的移动效果
		animation = new TranslateAnimation(1, 13, 10, 50);
		animation.setDuration(300);
		animationSet.addAnimation(animation);
		// 调用动画的选装效果
		animation = new RotateAnimation(30, 10);
		animation.setDuration(300);
		animationSet.addAnimation(animation);

		// 调用动画是缩放效果
		animation = new ScaleAnimation(5, 0, 2, 0);
		animation.setDuration(300);
		animationSet.addAnimation(animation);

		// 创建一个新的布局动画控制器与指定的延时和指定的动画
		LayoutAnimationController controller = new LayoutAnimationController(
				animationSet, 1);

		// 实例化组件
		gridView = (GridView) this.findViewById(R.id.gridview);
		// 设置布局动画控制器
		gridView.setLayoutAnimation(controller);

		listView = (ListView) this.findViewById(R.id.listview);
		// 设置布局动画控制器
		listView.setLayoutAnimation(controller);
		/**
		 * 当设置为非零值,缓存颜色提示表明这个列表总是画上的固体、印刷品、不透明的背景。
		 * 零意味着背后的这个对象是半透明的(非固体)或不是由一个单一的颜色。 这个暗示将不会影响任何现有的背景设置在绘图该视图
		 * */
		listView.setCacheColorHint(0);

		// 设置监听事件
		gridView.setOnItemClickListener(this);
		listView.setOnItemClickListener(this);

		softwaremanger = (ImageButton) this.findViewById(R.id.softwaremanger);
		changeView = (ImageButton) this.findViewById(R.id.changeview);

		/**
		 * changeView图片按钮的监听事件处理
		 * 
		 * *
		 **/
		changeView.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				if (islistview) {

					// 调用mytoast进行提示
					mytoast.mytoast(SoftwareManagerActivity.this,
							R.drawable.grids, "网格显示", Toast.LENGTH_LONG);
					// 设置图片资源
					changeView.setImageResource(R.drawable.grids);
					// 设置渲染的网格布局不可见
					gridView.setVisibility(View.GONE);
					// 设置渲染的列表布局不可见

					listView.setVisibility(View.VISIBLE);

					// AlphaAnimation 控制渐变透明的动画效果
					// ScaleAnimation 控制尺寸伸缩的动画效果
					// TranslateAnimation 控制画面平移的动画效果

					// LayoutAnimation 渲染ViewGroup中每个View显示时候的动画效果
					AnimationSet animationSet = new AnimationSet(false);
					// RotateAnimation 控制画面角度变化的动画效果
					Animation animation = new RotateAnimation(60, 0);

					// 设置加速度曲线为这个动画。予置常数的加载资源从指定的上下文。
					animation.setInterpolator(SoftwareManagerActivity.this,
							android.R.anim.overshoot_interpolator);
					animation.setDuration(1000);
					animationSet.addAnimation(animation);

					animation = new AlphaAnimation(0, 1);
					animation.setDuration(500);
					animationSet.addAnimation(animation);
					gridView.startAnimation(animationSet);
					gridView.startLayoutAnimation();

					// 设置islistview为false
					islistview = false;

				} else {

					// 调用mytoast 否则就是列表显示
					mytoast.mytoast(SoftwareManagerActivity.this,
							R.drawable.list, "列表显示", Toast.LENGTH_LONG);
					changeView.setImageResource(R.drawable.list);
					gridView.setVisibility(View.GONE);
					listView.setVisibility(View.VISIBLE);

					// 将动画常数设为假,假表示--每个动画应该使用它自己的予置常数。   
					AnimationSet animationSet = new AnimationSet(false);

					Animation animation = new TranslateAnimation(200, 1, 200, 1);
					animation.setDuration(500);
					// 设置加速度曲线为这个动画。予置常数的加载资源从指定的上下文。
					animation.setInterpolator(SoftwareManagerActivity.this,
							android.R.anim.bounce_interpolator);
					animationSet.addAnimation(animation);

					// 缩放动画
					animation = new ScaleAnimation(0, 1, 0, 1);
					animation.setDuration(500);
					animationSet.addAnimation(animation);
					listView.startAnimation(animationSet);
					islistview = true;

				}

			}
		});

		/***
		 * 
		 * 对softwaremanger图片按钮设置文件管理的监听事件 *
		 **/
		softwaremanger.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				if (allapp) {
					// 显示当前用户app的图片
					softwaremanger.setImageResource(R.drawable.user);

					// 用户安装的显示
					showInfos = userInfos;
					allapp = false;
					// 调用mytoast进行提示一下
					mytoast.mytoast(SoftwareManagerActivity.this,
							R.drawable.user, "用户安装的程序列表", Toast.LENGTH_LONG);

				} else {
					// 调用显示所有app的图片包括系统的app
					softwaremanger.setImageResource(R.drawable.all);
					// 所有app应用显示
					showInfos = packageInfos;
					allapp = true;
					mytoast.mytoast(SoftwareManagerActivity.this,
							R.drawable.all, "所有程序的列表", Toast.LENGTH_LONG);

				}
				// /调用Setadapter方法进行显示
				gridView.setAdapter(new GridViewAdapter(
						SoftwareManagerActivity.this, showInfos));
				listView.setAdapter(new ListViewAdapter(
						SoftwareManagerActivity.this, showInfos));

			}
		});
		// 显示进度对画框
		progressDialog = progressDialog.show(this, "请稍后...",
				"正在收索你所安装的应用程序...", true, false);
		// 启动一个新线程
		Thread thread = new Thread(this);
		thread.start();

	}

	/***
	 * 
	 * 
	 * **/

	@Override
	public void run() {
		// 得到用户的运行或者卸载app的信息
		packageInfos = getPackageManager().getInstalledPackages(
				PackageManager.GET_UNINSTALLED_PACKAGES
						| PackageManager.GET_ACTIVITIES);

		// 构造一个新的ArrayList实例初始产能为零
		userInfos = new ArrayList<PackageInfo>();
		// /列出所有的app包的信息
		for (int i = 0; i < packageInfos.size(); i++) {

			PackageInfo temp = packageInfos.get(i);
			ApplicationInfo applicationinf = temp.applicationInfo;
			boolean flag = false;
			if ((applicationinf.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {

				flag = true;

			} else if ((applicationinf.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {

				flag = true;
			}
			if (flag) {
				userInfos.add(temp);

			}

		}
		try {
			Thread.currentThread().sleep(2000);
		} catch (Exception e) {
			// TODO: handle exception
		}
		myhHandler.sendEmptyMessage(SEARCH);
		try {
			Thread.currentThread().sleep(5000);
		} catch (Exception e) {
			// TODO: handle exception
		}

	}

	/***
	 * 
	 * 为item设置单击事件 *
	 *****/

	public void onItemClick(AdapterView<?> arg0, View view, int posoition,
			long id) {
		// 设置对话框里面的item
		final CharSequence[] items = { "启动程序", "详细信息", "卸载程序" };
		// 返回元素在指定位置在这个列表中
		final PackageInfo tempinfo = showInfos.get(posoition);

		// 创建一个对话框
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("选项");
		builder.setItems(items, new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				switch (which) {
				case 0:
					String packagename = tempinfo.packageName;
					ActivityInfo activityInfo = tempinfo.activities[0];
					if (activityInfo == null) {

						Toast.makeText(SoftwareManagerActivity.this, "没有此应用",
								Toast.LENGTH_LONG).show();
						return;

					}
					String activityname = activityInfo.name;
					Intent intent = new Intent();
					intent.setComponent(new ComponentName(packagename,
							activityname));
					startActivity(intent);

					break;
				case 1:
					showAppDetail(tempinfo);

					break;

				case 2:

					Uri paclageuri = Uri.parse("package:"
							+ tempinfo.packageName);
					Intent deletIntent = new Intent();
					deletIntent.setAction(Intent.ACTION_DELETE);
					deletIntent.setData(paclageuri);
					startActivityForResult(deletIntent, 0);

					break;

				}
			}
		});

		builder.setNegativeButton("取消", null);
		builder.create().show();
	}

	/****
	 * GridViewAdapter
	 * 
	 * *
	 ***/
	class GridViewAdapter extends BaseAdapter {
		// 对布局进行渲染
		LayoutInflater inflater;
		// 列出所安装的app包的信息
		List<PackageInfo> packageInfos;

		// LayoutInflaterd的构造方法
		public GridViewAdapter(Context context, List<PackageInfo> packageInfos) {

			inflater = LayoutInflater.from(context);
			this.packageInfos = packageInfos;

		}

		// /d得到包的大小

		public int getCount() {
			// TODO Auto-generated method stub
			return packageInfos.size();
		}

		// d得到位置position
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return packageInfos.get(position);
		}

		// 得到id
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// 渲染自定的XML文件
			View view = inflater.inflate(R.layout.grid_app, null);
			// 实例化组件
			TextView textView = (TextView) view.findViewById(R.id.gridname);
			ImageView imageView = (ImageView) view.findViewById(R.id.grid_item);

			// 得到每个appb包的名字
			textView.setText(packageInfos.get(position).applicationInfo
					.loadLabel(getPackageManager()));
			// 设置图标为应用程序PackageManager加载图标
			imageView
					.setImageDrawable(packageInfos.get(position).applicationInfo
							.loadIcon(getPackageManager()));

			return view;
		}

	}

	/****
	 * 
	 * ListViewAdapter 列表显示所有安装的app的文件
	 * 
	 * *
	 ***/
	class ListViewAdapter extends BaseAdapter {

		// 把布局XML文件转换成相应的视图对象
		LayoutInflater inflater;
		// 列出所安装的app包的信息
		List<PackageInfo> packageInfos;

		public ListViewAdapter(Context context, List<PackageInfo> packageInfos) {
			// 从给定的上下文 获得LayoutInflater。
			inflater = LayoutInflater.from(context);
			this.packageInfos = packageInfos;

		}

		// /d得到包的大小
		public int getCount() {
			// TODO Auto-generated method stub
			return packageInfos.size();
		}

		// d得到位置position
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return packageInfos.get(position);
		}

		// 得到id
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			// 把布局XML文件转换成相应的视图对象
			View view = inflater.inflate(R.layout.list_app, null);
			// 实例化组件
			TextView appname = (TextView) view.findViewById(R.id.listname);
			TextView packagename = (TextView) view
					.findViewById(R.id.listpackgename);
			ImageView imageView = (ImageView) view.findViewById(R.id.listimage);

			// 返回PackageManager的所有app包信息。
			appname.setText(packageInfos.get(position).applicationInfo
					.loadLabel(getPackageManager()));
			// 得到每个appb包的名字
			packagename.setText(packageInfos.get(position).packageName);
			// 设置图标为应用程序PackageManager加载图标
			imageView
					.setImageDrawable(packageInfos.get(position).applicationInfo
							.loadIcon(getPackageManager()));

			return view;
		}

	}

	/*****
	 * 构造一个onActivityResult方法用于实现
	 * 
	 * *
	 *******/
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		packageInfos = getPackageManager().getInstalledPackages(
				PackageManager.GET_UNINSTALLED_PACKAGES
						| PackageManager.GET_ACTIVITIES);

		userInfos = new ArrayList<PackageInfo>();
		for (int i = 0; i < packageInfos.size(); i++) {

			PackageInfo temp = packageInfos.get(i);
			ApplicationInfo applicationInfo = temp.applicationInfo;
			boolean flag = false;
			if ((applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
				flag = true;

			} else if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
				flag = true;
			}
			if (flag) {

				userInfos.add(temp);
			}

		}
		if (allapp) {
			showInfos = packageInfos;
		} else {

			showInfos = userInfos;
		}
		// 调用GridViewAdapter和ListViewAdapter的方法
		gridView.setAdapter(new GridViewAdapter(SoftwareManagerActivity.this,
				showInfos));
		listView.setAdapter(new ListViewAdapter(SoftwareManagerActivity.this,
				showInfos));

	}

	protected void onResume() {
		super.onResume();
	}

	/***
	 * 显示应用程序的信息
	 * 
	 * *
	 **/

	private void showAppDetail(PackageInfo packageInfo) {

		// 创建一个对话框 标题栏是详细信息
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("详细信息");
		// 构建了一个新的StringBuffer对象
		StringBuffer message = new StringBuffer();
		// 想想这个字符串的message中追加 程序名称、 包名、 版本号、 版本名
		message.append("程序名称:"
				+ packageInfo.applicationInfo.loadLabel(getPackageManager()));
		message.append("\n 包名:" + packageInfo.packageName);
		message.append("\n 版本号:" + packageInfo.versionCode);
		message.append("'n 版本名:" + packageInfo.versionName);

		// 设置消息提示为字符串类型
		builder.setMessage(message.toString());
		// 设置详细信息的图标为应用程序图标
		builder.setIcon(packageInfo.applicationInfo
				.loadIcon(getPackageManager()));
		// 设置一个确定按钮,接着创建一个对话框显示
		builder.setPositiveButton("确定", null);
		builder.create().show();

	}
}

5.然后看看提示信息的功能实现mytoast.java

package com.wang;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class mytoast {
	public static void mytoast(Context context, int imageid, String content,
			int duration) {

		Toast toast = new Toast(context);

		toast.setDuration(duration);
		toast.setGravity(Gravity.BOTTOM, 0, 25);

		LinearLayout toastlayout = new LinearLayout(context);
		toastlayout.setOrientation(LinearLayout.HORIZONTAL);
		toastlayout.setGravity(Gravity.CENTER_VERTICAL);
		ImageView imageView = new ImageView(context);
		imageView.setImageResource(imageid);

		toastlayout.addView(imageView);
		TextView tv_content = new TextView(context);
		tv_content.setText(content);
		tv_content.setBackgroundColor(Color.BLACK);

		toastlayout.addView(tv_content);
		toast.setView(toastlayout);
		toast.show();

	}

}

6.接着要看看动画效果的实现

layout1.xml

<?xml version="1.0" encoding="utf-8"?>

<layoutAnimation 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:delay="50"
		android:animation="@anim/set1"
		/>

7.set1.xml实现旋转着有透明到完全不透明的淡入淡出的效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 实现动画的旋转和淡入淡出的效果 -->
    <rotate
        android:duration="1000"
        android:fromDegrees="60"
        android:interpolator="@android:anim/overshoot_interpolator"
        android:toDegrees="1.0" />

    <alpha
        android:duration="500"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toAlpha="1.0" />

</set>
8.接着就可以看看那运行效果喽!!

第一张图片是进度对话框的实现  ,                           第二章是网格列表的实现,                                                               第三张的列表格式的实现,

第四张是点击item时候的监听事件的实现,             第五张是详细信息的显示                                                                   第六张是卸载应用程序的实现




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值