软件管理器的实现
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时候的监听事件的实现, 第五张是详细信息的显示 第六张是卸载应用程序的实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!