前几篇有关Android的博文中。向大家介绍了几个项目中经常使用的有用功能。那么在这篇博文中。我将向大家介绍怎样获取Android手机中已经安装的手机应用程序,有用过金山手机卫士或者360手机卫士的童鞋都知道。这些软件都能够获取到当前手机中安装的应用程序。

那么,这些功能是怎样实现的呢?就让我们一起来看看这些功能详细是怎样实现的吧。

一、原理

原理非常easy,我们通过Android中提供的PackageManager类,来获取手机中安装的应用程序信息,将这些信息封装成一个对象,这个对象包括应用程序的图标、名称、版本、包名、是否是用户应用程序等信息。然后将这些对象封装成一个对象集合。再将这个集合显示到界面的listView上。形成一个应用程序列表。呈现给用户的便是一个手机中安装的应用程序列表了。

原理是不是非常easy呢?以下,就让我们一起来实现这些功能吧。

二、实现

1、创建应用程序的实体类AppInfo

为了更加面向对象化和体现面向对象的封装性。我将获取到的每个应用程序信息封装成了一个java对象,这个对象包括应用程序的图标、名称、版本、包名、是否是用户应用程序等信息。

详细实现代码例如以下:

package cn.lyz.mobilesafe.domain;

import android.graphics.drawable.Drawable;

/**

* 获取的应用基本信息实体类

* @author liuyazhuang

*

*/

public class AppInfo {

//图标

private Drawable app_icon;

//应用名称

private String app_name;

//应用版本

private String app_version;

//应用包名

private String packagename;

//是否是用户app

private boolean isUserApp;

public AppInfo() {

super();

// TODO Auto-generated constructor stub

}

public AppInfo(Drawable app_icon, String app_name, String app_version,

String packagename) {

super();

this.app_icon = app_icon;

this.app_name = app_name;

this.app_version = app_version;

this.packagename = packagename;

}

public AppInfo(Drawable app_icon, String app_name, String app_version,

String packagename, boolean isUserApp) {

super();

this.app_icon = app_icon;

this.app_name = app_name;

this.app_version = app_version;

this.packagename = packagename;

this.isUserApp = isUserApp;

}

public Drawable getApp_icon() {

return app_icon;

}

public void setApp_icon(Drawable app_icon) {

this.app_icon = app_icon;

}

public String getApp_name() {

return app_name;

}

public void setApp_name(String app_name) {

this.app_name = app_name;

}

public String getApp_version() {

return app_version;

}

public void setApp_version(String app_version) {

this.app_version = app_version;

}

public String getPackagename() {

return packagename;

}

public void setPackagename(String packagename) {

this.packagename = packagename;

}

public boolean isUserApp() {

return isUserApp;

}

public void setUserApp(boolean isUserApp) {

this.isUserApp = isUserApp;

}

@Override

public String toString() {

return "AppInfo [app_icon=" + app_icon + ", app_name=" + app_name

+ ", app_version=" + app_version + ", packagename="

+ packagename + ", isUserApp=" + isUserApp + "]";

}

}

2、获取手机应用程序的业务类AppInfoService

这个类主要实现获取手机中安装的应用程序的主要业务功能。封装了怎样获取手机安装的应用程序的方法。

详细实现代码例如以下:

package cn.lyz.mobilesafe.engine;

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.content.pm.PackageManager.NameNotFoundException;

import android.graphics.drawable.Drawable;

import cn.lyz.mobilesafe.domain.AppInfo;

/**

* 获取手机应用程序

* @author liuyazhuang

*

*/

public class AppInfoService {

private Context context;

private PackageManager pm;

public AppInfoService(Context context) {

// TODO Auto-generated constructor stub

this.context = context;

pm = context.getPackageManager();

}

/**

* 得到手机中全部的应用程序信息

* @return

*/

public List getAppInfos(){

//创建要返回的集合对象

List appInfos = new ArrayList();

//获取手机中全部安装的应用集合

List applicationInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

//遍历全部的应用集合

for(ApplicationInfo info : applicationInfos){

AppInfo appInfo = new AppInfo();

//获取应用程序的图标

Drawable app_icon = info.loadIcon(pm);

appInfo.setApp_icon(app_icon);

//获取应用的名称

String app_name = info.loadLabel(pm).toString();

appInfo.setApp_name(app_name);

//获取应用的包名

String packageName = info.packageName;

appInfo.setPackagename(packageName);

try {

//获取应用的版本

PackageInfo packageInfo = pm.getPackageInfo(packageName, 0);

String app_version = packageInfo.versionName;

appInfo.setApp_version(app_version);

} catch (NameNotFoundException e) {

e.printStackTrace();

}

//推断应用程序是否是用户程序

boolean isUserApp = filterApp(info);

appInfo.setUserApp(isUserApp);

appInfos.add(appInfo);

}

return appInfos;

}

//推断应用程序是否是用户程序

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;

}

}

3、样式文件styles.xml

在res/values文件夹下新建styles.xml文件来定义应用程序的样式信息。我在这个文件里主要定义个两个样式。

详细代码例如以下:

fill_parent

1dip

5dip

@drawable/devide_line

fill_parent

wrap_content

center

#42E700

25sp

4、主布局文件applationinstall.xml

详细实现代码例如以下:

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

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

style="@style/text_title_style"

android:text="所 有 程 序" />

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:id="@+id/lv_appmanage"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:cacheColorHint="#00000000"

android:divider="#fff"

android:fastScrollEnabled="true"

android:dividerHeight="1.0dip"

android:paddingLeft="3.0dip"

android:paddingRight="3.0dip" />

android:id="@+id/rl_loading"

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical"

android:layout_centerInParent="true">

android:id="@+id/pb"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dip"

android:text="正在载入应用程序。。"

android:textColor="#fff"

android:textSize="22sp" />

5、ListView中每一项条目布局applationinstall_item.xml

详细实现代码例如以下

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:paddingBottom="8.0dip"

android:paddingLeft="6.0dip"

android:paddingRight="5.0dip"

android:paddingTop="8.0dip" >

android:id="@+id/iv_appicon"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:src="@drawable/ic_launcher" />

android:id="@+id/tv_appname"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_marginLeft="4.0dip"

android:layout_toRightOf="@id/iv_appicon"

android:textColor="#fff"

android:text="我最摇摆"

android:textSize="16.0dip" />

android:id="@+id/tv_appversion"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_marginLeft="4.0dip"

android:textColor="#fff"

android:layout_marginRight="10dp"

android:text="1.0"

android:textSize="16.0dip" />

6、自己定义ListView适配器AppManagerAdapter

这个类继承自BaseAdapter主要作为List显示数据的适配器,在这个类中通过布局载入器LayoutInflater来载入条目布局。找到布局上的控件来设置对应的信息。

详细实现代码例如以下:

package cn.lyz.mobilesafe.adapter;

import java.util.List;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

import cn.lyz.mobilesafe.R;

import cn.lyz.mobilesafe.domain.AppInfo;

/**

* App管理的Adapter类

* @author liuyazhuang

*

*/

public class AppManagerAdapter extends BaseAdapter {

private Context context;

//布局载入器

private LayoutInflater mInflater;

private List appInfos;

//动态改变appInfos

public void setAppInfos(List appInfos) {

this.appInfos = appInfos;

}

public AppManagerAdapter(Context context,List appInfos) {

this.context = context;

this.appInfos = appInfos;

mInflater = LayoutInflater.from(context);

}

public int getCount() {

return appInfos.size();

}

public Object getItem(int position) {

return appInfos.get(position);

}

public long getItemId(int position) {

return position;

}

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

//1 得到控件

//2 得到数据

//3 绑定数据

View view = null;

if(convertView != null){

view = convertView;

}else{

view = mInflater.inflate(R.layout.applationinstall_item, null);

}

//获取布局控件

ImageView iv_appicon = (ImageView) view.findViewById(R.id.iv_appicon);

TextView tv_appname = (TextView) view.findViewById(R.id.tv_appname);

TextView tv_appversion = (TextView) view.findViewById(R.id.tv_appversion);

//获取position位置上的AppInfo对象

AppInfo appInfo = appInfos.get(position);

iv_appicon.setImageDrawable(appInfo.getApp_icon());

tv_appname.setText(appInfo.getApp_name());

tv_appversion.setText(appInfo.getApp_version());

return view;

}

}

7、程序显示界面AppManagerActivity

这个类实现的功能非常easy,调用其它类的方法,将获取的信息显示到ListView上。

详细的实现是在onCreate方法中找到布局上的控件。并在一个线程程序中调用AppInfoService中的方法获取手机中安装的应用程序,并将获取的结果通过Handler与Message机制传递到主线程,主线程将这些数据显示到UI视图上。

详细实现代码例如以下:

package cn.lyz.mobilesafe.activity;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.pm.PackageManager;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.widget.ListView;

import android.widget.PopupWindow;

import android.widget.RelativeLayout;

import android.widget.TextView;

import cn.lyz.mobilesafe.R;

import cn.lyz.mobilesafe.adapter.AppManagerAdapter;

import cn.lyz.mobilesafe.domain.AppInfo;

import cn.lyz.mobilesafe.engine.AppInfoService;

/**

* APP管理的Manager类

* @author liuyazhuang

*

*/

public class AppManagerActivity extends Activity{

protected static final int SUCCESS_GET_APPLICAITON = 0;

//布局中的各个控件

private RelativeLayout rl_loading;

private ListView lv_appmanage;

private TextView tv_title;

//包管理器

private PackageManager pm;

//获取手机应用信息的业务类

private AppInfoService appInfoService;

//手机应用app信息集合

private List appInfos;

//用户应用程序信息集合

private List userAppInfos;

//是否是全部的app程序,默觉得true

private boolean isAllApp = true;

//AppManagerAdapter适配器对象

private AppManagerAdapter mAdapter;

private PopupWindow mPopupWindow;

//mHandler方法

private Handler mHandler = new Handler(){

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case SUCCESS_GET_APPLICAITON:

//给listview去绑定数据。隐藏载入的控件

mAdapter = new AppManagerAdapter(getApplicationContext(), appInfos);

//设置数据

lv_appmanage.setAdapter(mAdapter);

//隐藏RelativeLayout

rl_loading.setVisibility(View.GONE);

//View.VISIBLE (控件显示)View.INVISIBLE(控件隐藏 但占领空间) View.GONE(控件隐藏 不占领空间)

break;

default:

break;

}

};

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.applationinstall);

//获取布局中的控件

rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);

lv_appmanage = (ListView) findViewById(R.id.lv_appmanage);

tv_title = (TextView) findViewById(R.id.tv_title);

//实例化AppInfoService对象

appInfoService = new AppInfoService(this);

//包管理器

pm = getPackageManager();

//在子线程中获取手机安装的应用程序信息

new Thread(){

public void run() {

appInfos = appInfoService.getAppInfos();

userAppInfos = new ArrayList();

for(AppInfo appInfo:appInfos){

if(appInfo.isUserApp()){

userAppInfos.add(appInfo);

}

}

Message msg = new Message();

msg.what = SUCCESS_GET_APPLICAITON;

mHandler.sendMessage(msg);

};

}.start();

}

}

补充:推断应用程序是否是用户程序

//推断应用程序是否是用户程序

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;

}

三、执行效果

正在载入应用程序

获取到手机中安装的应用程序

四、温馨提示

本实例中。为了方面,我把一些文字直接写在了布局文件里和相关的类中。大家在真实的项目中要把这些文字写在strings.xml文件里,在外部引用这些资源,切记,这是作为一个Android程序猿最主要的开发常识和规范,我在这里仅仅是为了方便直接写在了类和布局文件里。

java获取手机安装app_Android之——获取手机安装的应用程序相关推荐

  1. Android截图apk,PC获取手机截图、复制文件、安装APK

    PC获取手机截图.复制文件.安装APK 我在eoe上的帖子的链接 PC获取手机截图.复制文件.安装APK http://www.eoeandroid.com/thread-324986-1-1.htm ...

  2. Android中高仿快牙实现Socket列表的展示,获取安卓手机系统安装的应用和自己安装的应用相关信息

    在安卓中,我们看到了快牙.茄子快传等软件的功能的使用.实现端对端的进行传输数据,根据最近的需求了解和检测,并且在网上疯狂的进行搜索了一下.我研究了一下高仿茄子快传的开源代码,发现里面展示应用的列表发现 ...

  3. java 获取手机归属地_java 获取手机归属地

    java 获取手机归属地 [2021-01-30 20:46:44]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/( ...

  4. 如何root安卓手机_360手机如何刷机+获取完美ROOT+Xposed安装小技巧

    360手机一直以安全为口号,也许是因为360手机卫士的原因吧,总之360给人的感觉就是 一款安全产品,但在360手机领域上,安全似乎有点被捆绑的意思,手机广告偏多,用户 想到了刷机ROOT来解决以上问 ...

  5. 用Python实现手机抓包,获取当当图书差评数据!

    在这个万物互联的时代,手机端(App).电脑端(Web),连接着你我他. 本次学习了手机抓包的相关知识,了解了Charles-mitmproxy-Appium的基本使用,通过对当当图书评论的爬取,得以 ...

  6. 一加手机怎么root权限_一加手机OnePlus卡刷获取root权限图文教程

    2016-08-25 09:20:37 一加手机OnePlus卡刷获取root权限图文教程 标签:一加手机,一加手机权限,一加手机刷机 [ROM之家]一加手机OnePlus One的root教程也出来 ...

  7. Android 获取手机系统版本号、获取手机型号、获取手机厂商、获取手机IMEI、获取手机CPU_ABI、获取手机唯一识别码

    1.先申请权限,关于如何申请权限请查看RxPermissions的使用(简单实用)_ErwinNakajima的博客-CSDN博客 2.手機唯一識別碼管理類. package com.phone.co ...

  8. htc管理root授权,htc手机怎么root权限获取

    HTC root权限怎么获取? 1.HTC手机解锁方法: 首先进入HTC官方网站,利用HTC账户完成登录操作后,点击"Unlock Bootloader"按钮. 2.之后在其解锁界 ...

  9. 通过数组获取4家店的最低手机价格

    import java.util.Scanner; //获取4家店的最低手机价格 public class GetMinPrice {     public static void main(Stri ...

最新文章

  1. 常用binlog日志操作命令
  2. pythonfor循环语句例题_python循环语句的使用练习题
  3. druid链接mysql-proxy_MySQL读写分离之mysql-proxy
  4. PAT 乙级 1048. 数字加密(20) Java版
  5. 邮票面值设计java_邮票面值设计
  6. 周志华机器学习西瓜书速记第一章绪论
  7. php测试号推送消息失败,用thinkphp5做微信公众号开发为什么关注推送消息回复不了一直提示服务器出现故障?...
  8. linux抓包-tcpdump
  9. 拨开字符编码的迷雾--字符编码转换
  10. 溜客php0day挖掘,【漏洞预警】PHP7被发现三个0day漏洞,其中一个还
  11. 基于 Mybatis 和 Springboot 的后台管理系统 BootDo | 软件推介
  12. 解决SharePoint 2003的爬网性能问题- 之四
  13. 基于SSM框架的毕业设计管理系统 毕业设计-附源码211633
  14. ubuntu18.04安装Nvidia显卡
  15. uniapp微信小程序授权微信头像昵称
  16. 软考中级哪个含金量高?我该如何选择?
  17. MySQL获取当前时间的各种方式
  18. 数据结构(一)STL二分法查找实现及上下界
  19. linux下vanish的部署
  20. 如何让HTML页面支持部分内容打印

热门文章

  1. SpokenEnglish--It's a piece of cake
  2. MongoDB多条件分组聚合查询
  3. metasploit 教程之基本参数和扫描
  4. 2018SDIBT_国庆个人第七场
  5. Java 并发编程 --- ThreadPoolExecutor(五)
  6. data-packed volume container - 每天5分钟玩转 Docker 容器技术(43)
  7. arguments的理解
  8. 查找当前SQL Server下的Active Session正连接着哪个数据库
  9. Linux中buff-cache占用过高解决方案
  10. 计算机桌面不来回变黑,电脑屏幕变小了左右黑几种解决方法