还是继续复习我的安卓基础吧,毕竟基础才是最重要的

这一篇文章将会用到复杂的listview,和获取系统软件信息,还有给Listview加动画效果.

先看看布局吧,源码在后面提供下载,只是一个包,因为我是拿测试项目在演示。

① 布局的建立

布局很简单 我直接贴源码吧 因为怕有些手机装的APP过多,所以加入了一个progressbar

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/tv_avail_rom"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="内存可用:"android:textColor="#000000" /><TextViewandroid:id="@+id/tv_avail_sd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="SD卡可用:"android:textColor="#000000" /></RelativeLayout><FrameLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent" ><LinearLayoutandroid:id="@+id/ll_loading"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:orientation="vertical"android:visibility="invisible" ><ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="正在加载程序信息..." /></LinearLayout><ListViewandroid:overScrollMode="never"android:fastScrollEnabled="true"android:id="@+id/lv_app_manager"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView><TextView android:id="@+id/tv_status"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="用户程序:6个"android:textColor="#ffffff"android:background="#ff888888"/></FrameLayout></LinearLayout>

②建立获取系统软件信息类

要得到系统软件信息,首先要通过一个类,PackageManager,里面可以获得很多东西 

一 、PackageManager的介绍

主要是管理应用程序包,通过它就可以获取应用程序信息。

二、利用PackageManager得到我们需要的软件信息

package com.example.Darkbutton.Appmanager;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;/*** @author xiaoxin007* 2014-12-6下午8:18:58* TODO 业务方法,提供手机里面安装的所有的应用程序信息*/
public class AppInfoProvider {/*** 获取所有的安装的应用程序信息。* @param context 上下文* @return*/public static List<AppInfo> getAppInfos(Context context){//1.获得一个包管理器PackageManager pm = context.getPackageManager();//2.所有的安装在系统上的应用程序包信息。List<PackageInfo> packInfos = pm.getInstalledPackages(0);//3.建立一个实体类 存储东西List<AppInfo> appInfos = new ArrayList<AppInfo>();//4.遍历for(PackageInfo packInfo : packInfos){AppInfo appInfo = new AppInfo();//packInfo  相当于一个应用程序apk包的清单文件String packname = packInfo.packageName;Drawable icon = packInfo.applicationInfo.loadIcon(pm);String name = packInfo.applicationInfo.loadLabel(pm).toString();int flags = packInfo.applicationInfo.flags;//应用程序信息的标记 相当于用户提交的答卷if((flags&ApplicationInfo.FLAG_SYSTEM)==0){//用户程序appInfo.setUserApp(true);}else{//系统程序appInfo.setUserApp(false);}if((flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==0){//手机的内存appInfo.setInRom(true);}else{//手机外存储设备appInfo.setInRom(false);}appInfo.setPackname(packname);appInfo.setIcon(icon);appInfo.setName(name);appInfos.add(appInfo);}return appInfos;}}

三、建立一个实体类

package com.example.Darkbutton.Appmanager;import android.graphics.drawable.Drawable;/*** @author xiaoxin007* 2014-12-6下午5:37:47* TODO 应用程序信息的业务bean*/
public class AppInfo {private Drawable icon;private String name;private String packname;private boolean inRom;private boolean userApp;public Drawable getIcon() {return icon;}public void setIcon(Drawable icon) {this.icon = icon;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPackname() {return packname;}public void setPackname(String packname) {this.packname = packname;}public boolean isInRom() {return inRom;}public void setInRom(boolean inRom) {this.inRom = inRom;}public boolean isUserApp() {return userApp;}public void setUserApp(boolean userApp) {this.userApp = userApp;}@Overridepublic String toString() {return "AppInfo [name=" + name + ", packname=" + packname + ", inRom="+ inRom + ", userApp=" + userApp + "]";}}

③ 主界面的业务逻辑

其实主要逻辑也无非是初始化组件,初始化数据,然后给listview 填充数据,最难的也就是adapter里面的逻辑

0.获取某个目录的空间大小

    /*** 获取某个目录的可用空间* * @param path* @return*/private long getAvailSpace(String path) {StatFs statf = new StatFs(path);statf.getBlockCount();// 获取分区的个数long size = statf.getBlockSize();// 获取分区的大小long count = statf.getAvailableBlocks();// 获取可用的区块的个数return size * count;}

一,初始化组件

    /*** 初始化组件*/private void initView() {tv_status = (TextView) findViewById(R.id.tv_status);tv_avail_rom = (TextView) findViewById(R.id.tv_avail_rom);tv_avail_sd = (TextView) findViewById(R.id.tv_avail_sd);lv_app_manager = (ListView) findViewById(R.id.lv_app_manager);ll_loading = (LinearLayout) findViewById(R.id.ll_loading);}

二,初始化数据

    /*** 初始化数据*/private void initData() {sdsize = getAvailSpace(Environment.getExternalStorageDirectory().getAbsolutePath());romsize = getAvailSpace(Environment.getDataDirectory().getAbsolutePath());tv_avail_sd.setText("SD卡可用空间:" + Formatter.formatFileSize(this, sdsize));tv_avail_rom.setText("内存可用空间:"+ Formatter.formatFileSize(this, romsize));}

三,给listview加入动画

    /*** listview动画*/private void initAnim() {AnimationSet set = new AnimationSet(false); Animation animation =  new TranslateAnimation(1, 13, 10, 50);  //ScaleAnimation 控制尺寸伸缩的动画效果  animation.setDuration(300);  set.addAnimation(animation); LayoutAnimationController controller = new LayoutAnimationController(set, 1);lv_app_manager.setLayoutAnimation(controller);   //ListView 设置动画效果  }

四,给Listview填充数据

    /*** 给Listview填充数据*/private void fillDataToListView() {//1.用户体验,加入progressbarll_loading.setVisibility(View.VISIBLE);//2.耗时操作加入线程以免GGnew Thread() {public void run() {//3.调用 类,获取到软件信息appInfos = AppInfoProvider.getAppInfos(AppManagerActivity.this);//4.因为要把系统,用户软件分开,所以单独建立两个数据存储userAppInfos = new ArrayList<AppInfo>();systemAppInfos = new ArrayList<AppInfo>();//5.遍历 填充进数组for (AppInfo info : appInfos) {if (info.isUserApp()) {userAppInfos.add(info);} else {systemAppInfos.add(info);}}// 加载listview的数据适配器 因为在线程之中,所以使用runOnUiThread 可以在ui更新runOnUiThread(new Runnable() {@Overridepublic void run() {if (adapter == null) {adapter = new AppManagerAdapter();lv_app_manager.setAdapter(adapter);} else {adapter.notifyDataSetChanged();}ll_loading.setVisibility(View.INVISIBLE);}});};}.start();}

5.复杂的listview布局是怎么来的

    private class AppManagerAdapter extends BaseAdapter {// 控制listview有多少个条目 第一个1 代表是显示 用户应用 第二个1代表系统应用@Overridepublic int getCount() {return userAppInfos.size() + 1 + systemAppInfos.size() + 1;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {AppInfo appInfo;if (position == 0) {// 显示的是用程序有多少个的小标签TextView tv = new TextView(getApplicationContext());tv.setTextColor(Color.WHITE);tv.setBackgroundColor(Color.GRAY);tv.setText("用户程序:" + userAppInfos.size() + "个");return tv;} else if (position == (userAppInfos.size() + 1)) {TextView tv = new TextView(getApplicationContext());tv.setTextColor(Color.WHITE);tv.setBackgroundColor(Color.GRAY);tv.setText("系统程序:" + systemAppInfos.size() + "个");return tv;} else if (position <= userAppInfos.size()) {// 用户程序int newposition = position - 1;// 因为多了一个textview的文本占用了位置appInfo = userAppInfos.get(newposition);} else {// 系统程序int newposition = position - 1 - userAppInfos.size() - 1;appInfo = systemAppInfos.get(newposition);}View view;ViewHolder holder;// if(position<userAppInfos.size()){//这些位置是留个用户程序显示的。// appInfo = userAppInfos.get(position);// }else{//这些位置是留个系统程序的。// int newposition = position - userAppInfos.size();// appInfo = systemAppInfos.get(newposition);// }if (convertView != null && convertView instanceof RelativeLayout) {// 不仅需要检查是否为空,还要判断是否是合适的类型去复用view = convertView;holder = (ViewHolder) view.getTag();} else {view = View.inflate(getApplicationContext(),R.layout.list_item_appinfo, null);holder = new ViewHolder();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_app_icon);holder.tv_location = (TextView) view.findViewById(R.id.tv_app_location);holder.tv_name = (TextView) view.findViewById(R.id.tv_app_name);view.setTag(holder);}holder.iv_icon.setImageDrawable(appInfo.getIcon());holder.tv_name.setText(appInfo.getName());if (appInfo.isInRom()) {holder.tv_location.setText("手机内存");} else {holder.tv_location.setText("外部存储");}return view;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}}

④ 软件管理的功能实现


当点击 listview条目的时候,会出现一个popwindow 有卸载 有分享,有启动 
        /*** 设置listview的点击事件*/lv_app_manager.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//设置点击第一个条目的时候不显示,因为不是软件if (position == 0) {return;//以此类推} else if (position == (userAppInfos.size() + 1)) {return;} else if (position <= userAppInfos.size()) {// 用户程序int newposition = position - 1;appInfo = userAppInfos.get(newposition);} else {// 系统程序int newposition = position - 1 - userAppInfos.size() - 1;appInfo = systemAppInfos.get(newposition);}// System.out.println(appInfo.getPackname());dismissPopupWindow();//填充一个popwindowView contentView = View.inflate(getApplicationContext(),R.layout.popup_app_item, null);ll_start = (LinearLayout) contentView.findViewById(R.id.ll_start);ll_share = (LinearLayout) contentView.findViewById(R.id.ll_share);ll_uninstall = (LinearLayout) contentView.findViewById(R.id.ll_uninstall);//启动的监听ll_start.setOnClickListener(AppManagerActivity.this);//分享的监听ll_share.setOnClickListener(AppManagerActivity.this);//卸载的监听ll_uninstall.setOnClickListener(AppManagerActivity.this);popupWindow = new PopupWindow(contentView, -2, -2);// 动画效果的播放必须要求窗体有背景颜色。// 透明颜色也是颜色popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));int[] location = new int[2];view.getLocationInWindow(location);// 在代码里面设置的宽高值 都是像素。---》dipint dip = 60;int px = DensityUtil.dip2px(getApplicationContext(), dip);System.out.println("px=" + px);popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP,px, location[1]);ScaleAnimation sa = new ScaleAnimation(0.3f, 1.0f, 0.3f, 1.0f,Animation.RELATIVE_TO_SELF, 0,Animation.RELATIVE_TO_SELF, 0.5f);sa.setDuration(300);AlphaAnimation aa = new AlphaAnimation(0.5f, 1.0f);aa.setDuration(300);AnimationSet set = new AnimationSet(false);set.addAnimation(aa);set.addAnimation(sa);contentView.startAnimation(set);}});}

具体功能的实现

一,点击事件的处理

    /*** 布局对应的点击事件*/@Overridepublic void onClick(View v) {dismissPopupWindow();switch (v.getId()) {case R.id.ll_share:shareApplication();break;case R.id.ll_start:startApplication();break;case R.id.ll_uninstall:if (appInfo.isUserApp()) {uninstallAppliation();}else{Toast.makeText(this, "系统应用只有获取root权限才可以卸载", 0).show();//Runtime.getRuntime().exec("");}break;}}

二,用短信实现分享功能

 /*** 分享一个应用程序*/private void shareApplication() {// Intent { act=android.intent.action.SEND typ=text/plain flg=0x3000000 cmp=com.android.mms/.ui.ComposeMessageActivity (has extras) } from pid 256Intent intent = new Intent();intent.setAction("android.intent.action.SEND");intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, "推荐您使用一款软件,名称叫:"+appInfo.getName());startActivity(intent);}

三 ,卸载应用

 /*** 卸载应用*/private void uninstallAppliation() {// <action android:name="android.intent.action.VIEW" />// <action android:name="android.intent.action.DELETE" />// <category android:name="android.intent.category.DEFAULT" />// <data android:scheme="package" />Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");intent.setAction("android.intent.action.DELETE");intent.addCategory("android.intent.category.DEFAULT");intent.setData(Uri.parse("package:" + appInfo.getPackname()));startActivityForResult(intent, 0);}

四 ,开启一个应用程序

  /*** 开启一个应用程序*/private void startApplication() {// 查询这个应用程序的入口activity。 把他开启起来。PackageManager pm = getPackageManager();// Intent intent = new Intent();// intent.setAction("android.intent.action.MAIN");// intent.addCategory("android.intent.category.LAUNCHER");// //查询出来了所有的手机上具有启动能力的activity。// List<ResolveInfo> infos = pm.queryIntentActivities(intent,// PackageManager.GET_INTENT_FILTERS);Intent intent = pm.getLaunchIntentForPackage(appInfo.getPackname());if (intent != null) {startActivity(intent);} else {Toast.makeText(this, "不能启动当前应用", 0).show();}}

点击下载源码

练手小项目(5)安全卫士_软件管理器相关推荐

  1. 练手小项目(5)安全卫士_程序锁

    最近想做的小新工具箱,一直想做一个程序锁,其实原理,很简单,先注册一个服务,检测手机所有进程,如果发现被加锁的app启动,马上弹出一个输入程序锁界面,但是这样子bug很多.我先做一个基本后面慢慢把bu ...

  2. go语言面向对象 练手小项目

    学习一门语言,最重要的就是动手,一个项目的代码写三遍,看起来笨的方法,实际上也是最快的方法. go语言的第一个练手小项目: 家庭收支记录软件的编写: 1.项目需求说明 模拟现实基于文本界面的<家 ...

  3. ssm练手小项目_20 个 JavaScript+Html+CSS 练手的小项目

    前言: 最近在 GitHub 上发现了一个 vanillawebprojects[1] 开源仓库,里面收集了 20 个 JavaScript+Html+CSS的练手项目,没有使用任何框架,可以让你从基 ...

  4. 台式小风扇(HTML+CSS+JS练手小项目)

    台式小风扇(HTML+CSS+JS练手小项目) 功能介绍 外观展示 HTML代码 CSS代码 JS代码 总结 功能介绍 前段时间看到这样的风扇特效,感觉还挺好玩,就自己也写一个练练手. 风扇有四个档位 ...

  5. 爬虫练手小项目:豆瓣高分图书TOP100

    爬虫练手小项目:豆瓣高分图书TOP100 import requests import re from requests.exceptions import RequestException impo ...

  6. 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)

    文章目录 前言 正文(无删减) 我的想法(删减修改版) 数据导入与数据存储 功能实现 数据结构 用户结构 SIM卡结构 AVL树数据结构 哈希表结构 数据表 用户表 SIM卡表 时间安排 前言 本月主 ...

  7. html+css+js之20个练手小项目(一)

    html+css+js之20个练手小项目(一)--Hangman 前言 一.HTML 二.CSS 三.JS 前言 前端新手练习,记录不迷失. 主要练习html和CSS布局以及JS. 来源github, ...

  8. 练手小项目,爬取3DM图片

    博客原文:https://weweweha.com 1. 概述 ​ 爬取3DM指定网页的游戏壁纸,并且通过多线程来加速爬取图片的速度. 2.使用库 ​ request库用来1解析指定网页,re库用来搜 ...

  9. c语言模拟器怎么打程序,C语言初学者练手小项目——万花模拟器

    原标题:C语言初学者练手小项目--万花模拟器 还记得小时候玩的万花尺么?好好玩,各种不同的点距能画出各种各样形状图形. C语言程序万花尺模拟 函数功能:每隔5秒随机生成万花图形 并自动保存作图参数以及 ...

最新文章

  1. [转]MySQL 5.6 my.cnf配置优化
  2. 第一周——数据分析之表示 —— Numpy 数据存取与函数
  3. 设计模式——开发常用的设计模式梳理
  4. 介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的
  5. java response.write_@ResponseBody与response.getWriter .write()区别
  6. python获取excel数据进行判断输出结果到excel,如何使用python xlrd/xlwt从一个excel工作簿提取数据并输出到另一个excel工作簿?...
  7. 配置python虚拟环境心得
  8. mongodb 3.4 安装_【云服务器Centos7.x建站】MongoDB 3.4安装、使用、错误总结
  9. 此版本的IDM不支持该类下载,请尝试将IDM更新至最新版本。
  10. linux服务器上怎么运行exe,用Linux服务器运行exe文件
  11. mrpoid模拟器java版_mrpoid模拟器2019下载
  12. 在vue中使用plupload上传图片到七牛(着重解决moxie is not defined问题)
  13. 浓缩书应用 Blinkist - 令人惊艳的商业策略
  14. 周伟焜:IBM为何重造信仰
  15. The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
  16. DELL安装不了mysql_dell电脑win10怎么安装mysql
  17. Conflux 创始人龙凡教授向浙江省委书记车俊汇报 Conflux 最新研发进展
  18. select下拉选项禁用
  19. win11快速启动有必要关闭吗?如何关闭?
  20. FreeRTOS学习 消息队列

热门文章

  1. 微信公众号关联微信小程序详细步骤
  2. 电脑鼠标失灵,一直单向移动
  3. day6-列表作业2
  4. 手把手教你将AI模型做成一个手机APP并成功运行
  5. ip-guard安全通讯设置功能支持域名
  6. 代码块(局部代码块、构造代码块、静态代码块)
  7. python 数据分析(pandas)
  8. 关于习惯——《习惯的力量》读后感
  9. python爬取文字和图片_python爬虫--xpath结合re同时爬取文字与图片
  10. AIX基础教程(转)