標籤:擷取所有本機程式 適配器 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)