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

來源:互聯網
上載者:User

標籤:序列   4.0   顯示   包管理器   case   位置   new   default   ica   

轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/47114331

前幾篇有關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;//是否是使用者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<AppInfo> getAppInfos(){//建立要返回的集合對象List<AppInfo> appInfos = new ArrayList<AppInfo>();//擷取手機中全部安裝的應用集合List<ApplicationInfo> 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檔案來定義應用程式的樣式資訊。我在這個檔案裡主要定義個兩個樣式。

詳細代碼例如以下:

<style name="view_divide_line_style">        <item name="android:layout_width">fill_parent</item>        <item name="android:layout_height">1dip</item>        <item name="android:layout_marginTop">5dip</item>        <item name="android:background">@drawable/devide_line</item>    </style>
<style name="text_title_style">        <item name="android:layout_width">fill_parent</item>        <item name="android:layout_height">wrap_content</item>        <item name="android:gravity">center</item>        <item name="android:textColor">#42E700</item>        <item name="android:textSize">25sp</item>    </style>

4、主布局檔案applationinstall.xml

詳細實現代碼例如以下:

<?

xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/tv_title" style="@style/text_title_style" android:text="所 有 程 序" /> <View style="@style/view_divide_line_style" /> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- android:cacheColorHint="#00000000" 緩衝的顏色 預設是黃色 android:divider="#00ffffff" 切割線 android:dividerHeight="3.0dip" 切割線的寬度 --> <ListView 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" /> <RelativeLayout android:id="@+id/rl_loading" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerInParent="true"> <ProgressBar android:id="@+id/pb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="正在載入應用程式。。" android:textColor="#fff" android:textSize="22sp" /> </LinearLayout> </RelativeLayout> </FrameLayout></LinearLayout>

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

詳細實現代碼例如以下

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

><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 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" > <ImageView android:id="@+id/iv_appicon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> <TextView 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" /> <TextView 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" /></RelativeLayout>

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<AppInfo> appInfos;//動態改變appInfospublic void setAppInfos(List<AppInfo> appInfos) {this.appInfos = appInfos;}public AppManagerAdapter(Context context,List<AppInfo> 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<AppInfo> appInfos;//使用者應用程式資訊集合private List<AppInfo> 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<AppInfo>();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;    }

三、執行效果

正在載入應用程式

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="340" width="433">

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

四、溫馨提示

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

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.