练手小项目(5)安全卫士_软件管理器
还是继续复习我的安卓基础吧,毕竟基础才是最重要的
这一篇文章将会用到复杂的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得到我们需要的软件信息
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 + "]";}}
③ 主界面的业务逻辑
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)安全卫士_软件管理器相关推荐
- 练手小项目(5)安全卫士_程序锁
最近想做的小新工具箱,一直想做一个程序锁,其实原理,很简单,先注册一个服务,检测手机所有进程,如果发现被加锁的app启动,马上弹出一个输入程序锁界面,但是这样子bug很多.我先做一个基本后面慢慢把bu ...
- go语言面向对象 练手小项目
学习一门语言,最重要的就是动手,一个项目的代码写三遍,看起来笨的方法,实际上也是最快的方法. go语言的第一个练手小项目: 家庭收支记录软件的编写: 1.项目需求说明 模拟现实基于文本界面的<家 ...
- ssm练手小项目_20 个 JavaScript+Html+CSS 练手的小项目
前言: 最近在 GitHub 上发现了一个 vanillawebprojects[1] 开源仓库,里面收集了 20 个 JavaScript+Html+CSS的练手项目,没有使用任何框架,可以让你从基 ...
- 台式小风扇(HTML+CSS+JS练手小项目)
台式小风扇(HTML+CSS+JS练手小项目) 功能介绍 外观展示 HTML代码 CSS代码 JS代码 总结 功能介绍 前段时间看到这样的风扇特效,感觉还挺好玩,就自己也写一个练练手. 风扇有四个档位 ...
- 爬虫练手小项目:豆瓣高分图书TOP100
爬虫练手小项目:豆瓣高分图书TOP100 import requests import re from requests.exceptions import RequestException impo ...
- 数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)
文章目录 前言 正文(无删减) 我的想法(删减修改版) 数据导入与数据存储 功能实现 数据结构 用户结构 SIM卡结构 AVL树数据结构 哈希表结构 数据表 用户表 SIM卡表 时间安排 前言 本月主 ...
- html+css+js之20个练手小项目(一)
html+css+js之20个练手小项目(一)--Hangman 前言 一.HTML 二.CSS 三.JS 前言 前端新手练习,记录不迷失. 主要练习html和CSS布局以及JS. 来源github, ...
- 练手小项目,爬取3DM图片
博客原文:https://weweweha.com 1. 概述 爬取3DM指定网页的游戏壁纸,并且通过多线程来加速爬取图片的速度. 2.使用库 request库用来1解析指定网页,re库用来搜 ...
- c语言模拟器怎么打程序,C语言初学者练手小项目——万花模拟器
原标题:C语言初学者练手小项目--万花模拟器 还记得小时候玩的万花尺么?好好玩,各种不同的点距能画出各种各样形状图形. C语言程序万花尺模拟 函数功能:每隔5秒随机生成万花图形 并自动保存作图参数以及 ...
最新文章
- [转]MySQL 5.6 my.cnf配置优化
- 第一周——数据分析之表示 —— Numpy 数据存取与函数
- 设计模式——开发常用的设计模式梳理
- 介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的
- java response.write_@ResponseBody与response.getWriter .write()区别
- python获取excel数据进行判断输出结果到excel,如何使用python xlrd/xlwt从一个excel工作簿提取数据并输出到另一个excel工作簿?...
- 配置python虚拟环境心得
- mongodb 3.4 安装_【云服务器Centos7.x建站】MongoDB 3.4安装、使用、错误总结
- 此版本的IDM不支持该类下载,请尝试将IDM更新至最新版本。
- linux服务器上怎么运行exe,用Linux服务器运行exe文件
- mrpoid模拟器java版_mrpoid模拟器2019下载
- 在vue中使用plupload上传图片到七牛(着重解决moxie is not defined问题)
- 浓缩书应用 Blinkist - 令人惊艳的商业策略
- 周伟焜:IBM为何重造信仰
- The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
- DELL安装不了mysql_dell电脑win10怎么安装mysql
- Conflux 创始人龙凡教授向浙江省委书记车俊汇报 Conflux 最新研发进展
- select下拉选项禁用
- win11快速启动有必要关闭吗?如何关闭?
- FreeRTOS学习 消息队列