安卓開發擷取本機所有已安裝程式(形成ListView)

來源:互聯網
上載者:User

標籤:擷取所有本機程式   適配器   listview   擷取程式表徵圖   getpackagemanager   

  項目剛好需要用到這個,查詢匯總了很多資料最後終於順利解決,也積累了不少查資料的技巧,現在把思路整理一下,希望能對想做類似功能的朋友有幫,希望結交熱愛移動開發的朋友。 下面切入正題!

 

  之前自己寫代碼一個很壞的習慣就是類的互相解耦之間做的很差,一堆代碼都是堆在一起的,從沒考慮到規劃介面,工具類。


   這裡首先建立一個儲存一個APP所有資訊的類,包括名字,表徵圖,版本號碼等。

//AllAppInfo類class AllAppInfo {      private int versionCode = 0;  //版本號碼         private String appname = "";// 程式名稱       private String packagename = "";    //包名稱       private Drawable appicon ;//表徵圖       private long lastInstal;//最後一次安裝時間       private ProviderInfo[] provider;//供應商       private String InstalPath;//安裝路徑       private int flag ;  //判斷是不是系統應用      public int getVersionCode() {        return versionCode;    }        public void setAppicon(PackageManager packageManager) {// TODO Auto-generated method stub}public void setVersionCode(int versionCode) {        this.versionCode = versionCode;    }        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 Drawable getAppicon() {        return appicon;    }        public void setAppicon(Drawable appicon) {        this.appicon = appicon;    }    /**    * @return the lastInstal    */    public long getLastInstal() {        return lastInstal;    }    /**    * @param firstInstallTime the lastInstal to set    */    public void setLastInstal(long firstInstallTime) {        this.lastInstal = firstInstallTime;    }    /**    * @return the provider    */    public ProviderInfo[] getProvider() {        return provider;    }    /**    * @param providers the provider to set    */    public void setProvider(ProviderInfo[] providers) {        this.provider = providers;    }    /**    * @return the instalPath    */    public String getInstalPath() {        return InstalPath;    }    /**    * @param instalPath the instalPath to set    */    public void setInstalPath(String instalPath) {        InstalPath = instalPath;    }       public void setFlags(int flag)  {  this.flag = flag ;  }    public int getFlags()  {  return this.flag ;  }}  

寫之前這個類看似寫了很多多餘的東西,但是程式的健壯性大大增加,將來需要深入開發這個APP列表的話一個setter加一個getter直接搞定,代碼邏輯一目瞭然。繼續。

這裡繼續建立一個Get函數,返回一個集合儲存所有需要查詢的內容


//Get函數    private ArrayList<AllAppInfo> Get(){      ArrayList<AllAppInfo> appList = new ArrayList<AllAppInfo>();         List<PackageInfo> packageInfos=getPackageManager().getInstalledPackages(0);      for (int i = 0; i < packageInfos.size(); i++) {          PackageInfo pInfo=packageInfos.get(i);          AllAppInfo allAppInfo=new AllAppInfo();          allAppInfo.setAppname(pInfo.applicationInfo.loadLabel(getPackageManager()).toString());//應用程式的名稱           allAppInfo.setPackagename(pInfo.packageName);//應用程式的包           allAppInfo.setVersionCode(pInfo.versionCode);//版本號碼           allAppInfo.setFlags(pInfo.applicationInfo.flags);   //uid號        allAppInfo.setLastInstal(pInfo.firstInstallTime);          //allAppInfo.setProvider(pInfo.providers);           allAppInfo.setAppicon( pInfo.applicationInfo.loadIcon(getPackageManager()) );        allAppInfo.setInstalPath(pInfo.applicationInfo.sourceDir);          appList.add(allAppInfo);      }      return appList;      }      

以上兩步做完之後整個模組基本就成了,剩下的就是配置一下介面適配器。


import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.content.pm.ProviderInfo;import android.content.pm.ResolveInfo;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.Adapter;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleAdapter.ViewBinder;public class AboutMore extends Activity {  private ListView listview ;private List<Map<String, Object>> listitem ;private String[] systemApp = {"設定","錄音機","時鐘"} ;/** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState)    {          super.onCreate(savedInstanceState);          setContentView(R.layout.aboutmore_layout);   listitem = new ArrayList<Map<String,Object>>();      //  Get();           ArrayList<AllAppInfo> list=this.Get();          for (Iterator<AllAppInfo> iterator = list.iterator(); iterator.hasNext();)         {              AllAppInfo allAppInfo = (AllAppInfo) iterator.next();              System.out.println(allAppInfo.getAppname()+" |"+allAppInfo.getPackagename()+"| "+allAppInfo.getVersionCode()+"|"+allAppInfo.getLastInstal()+"|"+allAppInfo.getInstalPath());              if((allAppInfo.getFlags() & ApplicationInfo.FLAG_SYSTEM)>0)  //如果判定為系統應用            {            int flag = 0 ;            for(int i = 0 ;i<systemApp.length ;i++)            {            if( systemApp[i].equals(allAppInfo.getAppname()) )            {            flag = 1 ;            }            }            if(flag == 0)            continue ;                        }           // System.out.println(allAppInfo.getAppname()+" |"+allAppInfo.getPackagename()+"| "+allAppInfo.getVersionCode()+"|"+allAppInfo.getLastInstal()+"|"+allAppInfo.getInstalPath());              Map<String, Object> showitem = new HashMap<String, Object>();            showitem.put("logo",allAppInfo.getAppicon() );              showitem.put("appName",allAppInfo.getAppname());              showitem.put("packagename",allAppInfo.getPackagename() ) ;            listitem.add(showitem);          }          SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.aboutmore_item_layout, new String[]{"logo","appName"}, new int[]{R.id.logo,R.id.app_name});myAdapter.setViewBinder(new ViewBinder() {           public boolean setViewValue(View view,Object data,String textRepresentation)           {                 if(view instanceof ImageView && data instanceof Drawable)                 {                      ImageView iv=(ImageView)view;                      iv.setImageDrawable((Drawable)data);                     return true;                   }                 else return false;            }     } );listview = (ListView) findViewById(R.id.listview) ;    //執行個體化listviewlistview.setAdapter(myAdapter);                           //為listview添加適配器//下面開始添加列表的事件監聽listview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stub    String packagename = listitem.get(position).get("packagename").toString() ;doStartApplicationWithPackageName(packagename);}});    }   }

這裡在上面代碼的最後調用了一個方法,通過程式的包開啟調用,以下的代碼轉自一篇部落格。部落格地址http://blog.csdn.net/mad1989/article/details/38090513,寫的很棒。


*     * 通過包的名字調用其他程式     * 來自:http://blog.csdn.net/mad1989/article/details/38090513     */private void doStartApplicationWithPackageName(String packagename) {// 通過包名擷取此APP詳細資料,包括Activities、services、versioncode、name等等PackageInfo packageinfo = null;try {packageinfo = getPackageManager().getPackageInfo(packagename, 0);} catch (NameNotFoundException e) {e.printStackTrace();}if (packageinfo == null) {return;}// 建立一個類別為CATEGORY_LAUNCHER的該包名的IntentIntent resolveIntent = new Intent(Intent.ACTION_MAIN, null);resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);resolveIntent.setPackage(packageinfo.packageName);// 通過getPackageManager()的queryIntentActivities方法遍曆List<ResolveInfo> resolveinfoList = getPackageManager().queryIntentActivities(resolveIntent, 0);ResolveInfo resolveinfo = resolveinfoList.iterator().next();if (resolveinfo != null) {// packagename = 參數packnameString packageName = resolveinfo.activityInfo.packageName;// 這個就是我們要找的該APP的LAUNCHER的Activity[組織形式:packagename.mainActivityname]String className = resolveinfo.activityInfo.name;// LAUNCHER IntentIntent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);// 設定ComponentName參數1:packagename參數2:MainActivity路徑ComponentName cn = new ComponentName(packageName, className);intent.setComponent(cn);startActivity(intent);}


最後曬上一張。  PS:自己在擷取APP表徵圖的代碼上花費了很多時間,現在特別說明一下。如下這樣完成AllAppInfo類的setAppicon方法就可以順利在需要的時候取出來用了

 allAppInfo.setAppicon( pInfo.applicationInfo.loadIcon(getPackageManager()) );  //通過getPackageManager



安卓開發擷取本機所有已安裝程式(形成ListView)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.