Android之——擷取手機安裝的應用程式

來源:互聯網
上載者:User

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;//是否是使用者appprivate 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;}@Overridepublic 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 stubthis.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;//動態改變appInfospublic 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程式,預設為trueprivate 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);//隱藏RelativeLayoutrl_loading.setVisibility(View.GONE);//View.VISIBLE (控制項顯示)View.INVISIBLE(控制項隱藏  但佔據空間)  View.GONE(控制項隱藏  不佔據空間)break;default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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();}}

 

三、運行效果

正在載入應用程式

擷取到手機中安裝的應用程式

四、溫馨提示

本執行個體中,為了方面,我把一些文字直接寫在了布局檔案中和相關的類中,大家在真實的項目中要把這些文字寫在strings.xml檔案中,在外部參考這些資源,切記,這是作為一個Android程式員最基本的開發常識和規範,我在這裡只是為了方便直接寫在了類和布局檔案中。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.