Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之——獲取手機安裝的應用程序

Android之——獲取手機安裝的應用程序

編輯:關於Android編程

 

前幾篇有關Android的博文中,向大家介紹了幾個項目中常用的實用功能,那麼在這篇博文中,我將向大家介紹如何獲取Android手機中已經安裝的手機應用程序,實用過金山手機衛士或者360手機衛士的童鞋都知道,這些軟件都可以獲取到當前手機中安裝的應用程序。那麼,這些功能是如何實現的呢?就讓我們一起來看看這些功能具體是如何實現的吧。

一、原理

原理很簡單,我們通過Android中提供的PackageManager類,來獲取手機中安裝的應用程序信息,將這些信息封裝成一個對象,這個對象包含應用程序的圖標、名稱、版本號、包名、是否是用戶應用程序等信息,然後將這些對象封裝成一個對象集合,再將這個集合顯示到界面的listView上,形成一個應用程序列表。呈現給用戶的便是一個手機中安裝的應用程序列表了。

原理是不是很簡單呢?下面,就讓我們一起來實現這些功能吧。

二、實現

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文件來定義應用程序的樣式信息,我在這個文件中主要定義個兩個樣式。

具體代碼如下:

 


 

4、主布局文件applationinstall.xml

具體實現代碼如下:

 




    

    

    <framelayout android:layout_height="fill_parent" android:layout_width="fill_parent">

        
        

        

            

                

                
            
        
    </framelayout>

 

5、ListView中每一項條目布局applationinstall_item.xml

具體實現代碼如下

 




    

    
    
    

 

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

這個類實現的功能很簡單,調用其他類的方法,將獲取的信息顯示到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();
		
	}
}

 

三、運行效果

正在加載應用程序

height=340

獲取到手機中安裝的應用程序

height=368

四、溫馨提示

本實例中,為了方面,我把一些文字直接寫在了布局文件中和相關的類中,大家在真實的項目中要把這些文字寫在strings.xml文件中,在外部引用這些資源,切記,這是作為一個Android程序員最基本的開發常識和規范,我在這裡只是為了方便直接寫在了類和布局文件中。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved