【android开发】手机应用管理器的实现之获取应用列表(一)
相信大家手机中都有应用管理器,很多第三方软件也是应用管理,但是感觉他们做的功能太多,附加内容太多,不是那种简洁的应用,于是自己就在网上看了看一些人做的,结合自己的思想,做了一个自己喜欢的那种简洁的应用管理器,非常的使用。我先介绍一下这个应用管理器,主要有哪些功能吧!
功能主要分为四块:运行、分享、加锁、卸载。点击标题栏可以切换所有应用和用户应用,非常的简洁实用,当然了实现起来也不是很难。下面我们就先看看运行的效果图吧:
主界面 第一次加锁设置密码
手机运行加锁程序时验证密码 解除应用加锁
上面就是系统最后的效果,由于实现起来步骤也不少,我们接下来将一步步的去实现,今天我们的任务就是实现将手机里面的所有应用程序取出来,放到列表并显示出来。
下面先看一下项目的目录结构:
一、我们先说一下布局文件:
主界面布局文件main_layout.xml,代码如下:
<?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" android:background="@drawable/logo"><LinearLayoutandroid:id="@+id/ll_app_logo"android:layout_width="fill_parent"android:layout_height="50dp"android:gravity="center_vertical|center_horizontal"android:background="@drawable/blue_btn"android:orientation="vertical"><TextViewandroid:id="@+id/tv_app_title" android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@android:color/white"android:textSize="22sp"android:text="@string/app_list_lago"android:focusable="false"/></LinearLayout><FrameLayout android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/list_back"><ListView android:id="@+id/lv_app_manager"android:layout_width="match_parent"android:layout_height="match_parent"android:cacheColorHint="@android:color/transparent"android:layout_marginTop="10dip" /><LinearLayout android:id="@+id/ll_app_manager_progress"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical|center_horizontal"android:orientation="vertical"android:visibility="gone"android:background="@drawable/logo"><ProgressBar android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/app_list_loading"android:textSize="18sp"android:textColor="#ffbc04e5"/></LinearLayout></FrameLayout></LinearLayout>
建一个布局文件用于保存应用程序的信息,最后在列表中显示app_manager_item.xml,代码如下:
<?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="horizontal"android:gravity="center_vertical" ><!-- android:scaleType="fitXY"把图片按照指定的大小在View中显示,拉伸显示图片,不保持原比例,填满View. --><ImageView android:id="@+id/iv_app_manager_icon"android:layout_width="60dip"android:layout_height="60dip"android:scaleType="fitXY"android:contentDescription="HELLO"/><TextView android:id="@+id/tv_app_manager_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dip"android:textSize="21sp"android:textColor="#ff000000"/><ImageView android:id="@+id/iv_app_lock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:scaleType="fitXY" android:src="@drawable/unlock" android:contentDescription="@string/hello_world"/>
</LinearLayout>
二、下面我们就要写java文件,来处理并显示出来效果:
先建一个AppInfo类,代码如下:
package com.xh.ui;import android.graphics.drawable.Drawable;
/*** 类名称:AppInfo * 类描述:应用程序类,包括了程序相关属性* 创建人:LXH * 创建时间:创建时间:2013-11-5 下午3:31:00 */
public class AppInfo {private Drawable icon;private String appName;private String packageName;private boolean isSystemApp;private long codesize;public long getCodesize() {return codesize;}public void setCodesize(long codesize) {this.codesize = codesize;}public Drawable getIcon() {return icon;}public void setIcon(Drawable icon) {this.icon = icon;}public String getAppName() {return appName;}public void setAppName(String appName) {this.appName = appName;}public String getPackageName() {return packageName;}public void setPackageName(String packageName) {this.packageName = packageName;}public boolean isSystemApp() {return isSystemApp;}public void setSystemApp(boolean isSystemApp) {this.isSystemApp = isSystemApp;}}
建一个获取应用程序信息的AppInfoProvider类,代码如下:
package com.xh.ui;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;
/*** 类名称:AppInfoProvider * 类描述:获取应用程序的相关信息* 创建人:LXH * 创建时间:创建时间:2013-11-5 下午3:31:00 */
public class AppInfoProvider {private PackageManager packageManager;//获取一个包管理器public AppInfoProvider(Context context){packageManager = context.getPackageManager();}/***获取系统中所有应用信息,*并将应用软件信息保存到list列表中。**/ public List<AppInfo> getAllApps(){List<AppInfo> list = new ArrayList<AppInfo>();AppInfo myAppInfo;//获取到所有安装了的应用程序的信息,包括那些卸载了的,但没有清除数据的应用程序 List<PackageInfo> packageInfos = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);for(PackageInfo info:packageInfos){myAppInfo = new AppInfo();//拿到包名String packageName = info.packageName;//拿到应用程序的信息 ApplicationInfo appInfo = info.applicationInfo;//拿到应用程序的图标Drawable icon = appInfo.loadIcon(packageManager);//拿到应用程序的大小//long codesize = packageStats.codeSize;//Log.i("info", "-->"+codesize);//拿到应用程序的程序名String appName = appInfo.loadLabel(packageManager).toString();myAppInfo.setPackageName(packageName);myAppInfo.setAppName(appName);myAppInfo.setIcon(icon);if(filterApp(appInfo)){myAppInfo.setSystemApp(false);}else{myAppInfo.setSystemApp(true);}list.add(myAppInfo);}return list;}/***判断某一个应用程序是不是系统的应用程序,*如果是返回true,否则返回false。*/ public boolean filterApp(ApplicationInfo info){//有些系统应用是可以更新的,如果用户自己下载了一个系统的应用来更新了原来的,它还是系统应用,这个就是判断这种情况的if((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){return true;}else if((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0){//判断是不是系统应用return true;}return false;}
}
最后在MainActivity类填写代码,处理结果,代码如下:
package com.xh.ui;import java.util.List;
import com.example.appmanager.R;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
/*** 类名称:MainActivity * 类描述:系统主页面* 创建人:LXH * 创建时间:2013-11-5 下午3:31:00 */
public class MainActivity extends Activity {private static final int GET_ALL_APP_FINISH = 1; private ListView lv_app_manager;//应用信息列表 private LinearLayout ll_app_manager_progress; //进度条 private AppInfoProvider provider; private AppManagerAdapter adapter; private List<AppInfo> list; @SuppressLint("HandlerLeak") private Handler handler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { case GET_ALL_APP_FINISH : //进度条设置为不可见 ll_app_manager_progress.setVisibility(View.GONE); adapter = new AppManagerAdapter(); lv_app_manager.setAdapter(adapter); break; default : break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); lv_app_manager = (ListView) findViewById(R.id.lv_app_manager); ll_app_manager_progress = (LinearLayout) findViewById(R.id.ll_app_manager_progress); ll_app_manager_progress.setVisibility(View.VISIBLE); /*** //开一个线程用于完成对所有应用程序信息的搜索 * 当搜索完成之后,就把一个成功的消息发送给Handler,* 然后handler把搜索到的数据设置进入listview里面 .* */new Thread() { public void run() { provider = new AppInfoProvider(MainActivity.this); list = provider.getAllApps(); Message msg = new Message(); msg.what = GET_ALL_APP_FINISH; handler.sendMessage(msg); }; }.start(); } //====================================================================== private class AppManagerAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { AppInfo info = list.get(position); if(convertView == null) { View view = View.inflate(MainActivity.this, R.layout.app_manager_item, null); AppManagerViews views = new AppManagerViews(); views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_manager_icon); views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_manager_name); views.iv_app_icon.setImageDrawable(info.getIcon()); views.tv_app_name.setText(info.getAppName()); view.setTag(views); return view; } else { AppManagerViews views = (AppManagerViews) convertView.getTag(); views.iv_app_icon.setImageDrawable(info.getIcon()); views.tv_app_name.setText(info.getAppName()); return convertView; } } } /*** 用来优化listview的类 * */private class AppManagerViews { ImageView iv_app_icon; TextView tv_app_name; }
}
好了,到此主要步骤和核心的代码就写完了,大家自己的项目上稍加修改,就可以了,资源文件大家可以从下面的链接中下载。今天的任务就结束了,由于内容比较简单,就不做详细说明了,下一篇我们将利用popupWindow类实现提示对话框!欢迎大家继续关注!(如下载资源后,遇到问题,请在博客里面留言,这样就可以大家一起交流了!)
【android开发】手机应用管理器的实现之获取应用列表(一)
【android开发】手机应用管理器的实现之获取应用列表(一)相关推荐
- android 布局管理器,【Android开发】布局管理器-表格布局
在XML布局文件中定义表格布局管理器的基本语法: 属性列表 > 需要添加的UI组件 多个TableRow TableLayout支持的XML属性: android:collapseColumns ...
- android闹钟测试工具,android开发:AlarmManager闹钟管理器的实例
1.AlarmManager,顾名思义,就是"提醒",是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的PendingIntent.通俗点,就是设置一 ...
- 【Android开发】布局管理器-线性布局
这里实现垂直布局和水平布局: 垂直布局效果图: 实现代码: 垂直线性布局 res/layout/main.xml: <LinearLayout xmlns:android="http: ...
- 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...
盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...
- 基于 Android 系统手机通讯录管理软件【100010322】
基于 Android 系统手机通讯录管理软件 第一章 绪论 1.1 项目研究背景 经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端.因此,移动终端的应用软件和需要的服务将会有很大的 ...
- 文件管理器android实现,Android开发之简单文件管理器实现方法
易采站长站为您分析Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下 本文实例讲述了Android开发之简单文件管理 ...
- android fragment 管理器,Android Fragment 與 Fragment管理器
Android Fragment 與 Fragment管理器 首先談談Fragement的需求 過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了: 例如下圖中,在Activity ...
- android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍
Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...
- android之ion内存储器管理器,Android ION
场景:android之ION内存储器管理器(1)- 简介 android之ION内存管理器(1)-- 简介 by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾20 ...
- android 三星调用拍照功能吗,Android 开发手机(三星)拍照应用照片旋转问题解决办法...
Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok ...
最新文章
- 【ORACLE SQL 语言】SQL语言四大类
- svg里写入html标签,如何将HTML元素放在内联SVG上
- 实现图片打乱_2020 回顾 | 25张图片,记录潮州的这一年
- python复杂网络点图可视化_Python学习工具:9个用来爬取网络站点的 Python 库
- TensorFlow2.0(八)--tf.function函数转换
- springboot幂等性_SpringBoot+Redis实现接口幂等性,就看这篇了
- Vue-学生管理功能实例
- java math.floordiv,Math类的常用方法--田小江
- Combination Sum II - LeetCode
- laravel上传文件到s3,打开链接无法下载而是直接在浏览器中显示内容
- 计算机机房的荷载,​计算机信息中心机房建设标准
- EMC标准与测试方法
- 面试题整理 | 45道CSS面试题
- CTF密码学之Base64,Base32,Base16
- 凯酷键盘KC-84 大写和ctrl 功能调换问题
- java写一个接口_一个标准的java接口写法是怎样的?java对外接口怎么写?
- 表空间的相关查询命令
- C语言数据类型重新认识
- php preg_match 漏洞,PHP preg_match()函数信息泄露漏洞
- 抖音自媒体账号被限流?这3种方法教你如何鉴别
热门文章
- 迈普路由器访问控制列表配置命令_迈普路由器配置手册
- java按键机nes模拟器_NES 模拟器开发教程 12 - 输入设备
- 0x80070057复制从服务器复制文件,0x80070057各种错误解决方法教程
- 未能启动apache服务器,教你apache服务无法启动一直失败怎么办
- 在Windows中查看文件的MD5值
- 招商证券交易系统宕机上热搜,遭深圳证监局责令整改
- 光流与Lucas-Kanade 光流法
- mediawiki mysql_MediaWiki/安装
- BUUCTF Misc wp大合集(1)
- python Beautifulsoup4爬取凡人修仙传仙界篇连载中文章并生成txt