在android下PackageManager相當windows下的程序管理器
1.得到PackageManager包管理器
PackageManager pm = getContext().getPackageManager();
2.在這個包管理器下有獲取標題,獲取圖標,獲取版本號,getInstalledApplications(int flags); 這方法是返回所有的應用程序信息返回List<ApplicationInfo>,
List<PackageInfo> packageInfos = pm.getInstalledPackages(flags);//這裏的flags傳的是範圍,如果傳一個PackageManger.GET_UNINSTALLED_PACKAGES那麼會把那麼卸載的但沒有清除數據的應用程序給返回回來.
3.遍歷信息獲取PackageInfo
○ packageinfo就相當於一個程序配置清單,可以獲取裏的配置信息,如果想獲取<manifest>結點裏的信息直接調用方法就可以,如果想獲取<application>結點裏面的方法就需要使用packinfo.applicationInfo()這個方法就可以得到<application>結點,然後就可以獲取裏面的信息了,返回值是ApplicationInfo對象,在這個對象裏面有獲取應用程序圖標,名稱,包等方法.
○ 在Applicationinfo對象中還有一個loadIcon(PackageManger pm)這個可以得到這個應用程序的圖標,返回的是一個Drawable類型
○ Drawable appicon = appinfo.loadIcon(pm);
○ String name = appinfo.loadLabel(pm).toString()返回應用程序的名稱
○ packinfo.packageName;獲取包名,packinfo.versionName;獲取版本信息
4.判斷是用戶程序還是系統程序,這個可以搜查系統源代碼的setting代碼,查看已下載,然後查看裏面的代碼是如果判斷的
5.獲取<uses-permission>結點的權限信息
在創建PackageInfo時指定他解析權限信息,因爲android在設置時默認是不解析權限信息,只解析圖標,名稱,包等信息,所以修改上面創建Packinfos的代碼
List<PackageInfo> packageInfos = pm.getInstalledPackages(PackageManger.GET_UNINSTALLED_PACKAGES|PackageManger.GET_PERMISSIONS);
然後就可以調用appinfo.requestedPermissions;獲取權限的數組,然後就可遍歷判斷了
因爲listView在使用歷吏緩存view對象時要避免使用歷史緩存的view裏面的一部分佈局是可變的,不是每個view都有的,那麼我們就要使用holder.ll.removeAllViews()的方法去清除這個佈局中一個佈局的的緩存view,因爲這部分緩衝不是每個view都是需要的
在一個listView中如何分別顯示用戶應用跟系統應用
需要多顯示出來兩個條目,分別顯示是用戶程序還是系統程序
1.在繼承BaseAdapter的適配器類就要更改了,顯示數據要加上2,因爲要加兩個條目
2.因爲需要顯示用戶跟系統的程序,所以要在獲取所以的程序後進行判斷,然後分別存在用戶集合跟系統集合中
3.因爲有了系統跟用戶的集合那麼我們定義適配器時計算長度可以使用用戶集合數量+1+系統集合數量+1
4.然後在getIView方法中就要進行判斷了,因爲要顯示兩種不同的view
判斷如果位置=0那麼創建一個TextView用來顯示用戶程序的標籤,
如果位置<=用戶集合的數量那麼就顯示用戶的程序,
如果位置等用戶集合的數量+1那麼我們就又要顯示一個TextView對象顯示系統程序文本
如果位置大於用戶集合的數量+1小於總集合那麼就顯示系統條目,不過條目的位置要注意,不是直接position,而是position-用戶的集合-2,因爲我們要根據position去取系統集合裏的數據
注意上面的應用程序顯示是沒有問題的但是拖動的時候會有問題,因爲我們使用了歷史緩存數據但是一個是textView,而另一個是我們填充的view對象,這兩個對象不一致,所以我們在適配器類中還要判斷他的類型,如果歷史緩衝對象爲空或者是TextView對象(converView == null || converView instanceof Textview)那麼我們就得新創建一個對象不使用緩存對象
採用異步任務執行耗時的操作:
一般我們要在一個線程中發送一個信息給handleMessage,然後更新UI,google也幫我們封裝了這個操作,AsyncTask<Params,Progress,Result>
Params:執行線程時傳進來的參數,如果不關心的話可以傳一個void,
Progress:可以發佈進度如果不關心可以傳一個void
Result:任務執行完返回的值,不關心可以傳一個void,這個是doInBackground()方法返回的值
複寫裏面三個方法:
doInBackground();//運行在子線程裏面的方法,可以進行耗時的操作
onPreExceute();//在開啓異步任務後,執行異步任務之前調用的方法,運行在主線程(UI),因爲在主線程所以可以調用toast
onPostExecute()//執行異步任務之後調用的方法,運行在主線程(UI),參數是doInBackground()返回回來的數據
onProgressUpdate()這個方法可以裝進度發佈出去,這個執行要求在new AsyncTask時要將發佈進度可以將參數void改成Integer
然後調用task.execute()//執行異步任務
用異步更新進度
1.複寫onProgressUpdate(Integer… value){
pd.setProgress(value[0]);
}//這個方法是用publishProgress()這個方法去激活的
2.在外面創建一個進度條
private ProgressDialog pd;
3.在複寫的onPreExecute()的方法中初始化進度條
pd = new ProgressDialog(AsyncTaskActivity.this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle("標題");
pd.setMax(100);
pd.show();
4.在doInBackground()方法中更新進度,可以用循環去更新進度
publishProgress(value);//發佈進度,然後onProgressUpdate()這個方法會接收到
5.在onPostExecute()這個方法結束進度條pd.dismiss();
如果只要一個線程那麼就不用異步操作了,因爲異步爲開啓一個線程池,會消耗內存