編輯:關於Android編程
前幾篇有關Android的博文中,向大家介紹了幾個項目中常用的實用功能,那麼在這篇博文中,我將向大家介紹如何獲取Android手機中已經安裝的手機應用程序,實用過金山手機衛士或者360手機衛士的童鞋都知道,這些軟件都可以獲取到當前手機中安裝的應用程序。那麼,這些功能是如何實現的呢?就讓我們一起來看看這些功能具體是如何實現的吧。
原理很簡單,我們通過Android中提供的PackageManager類,來獲取手機中安裝的應用程序信息,將這些信息封裝成一個對象,這個對象包含應用程序的圖標、名稱、版本號、包名、是否是用戶應用程序等信息,然後將這些對象封裝成一個對象集合,再將這個集合顯示到界面的listView上,形成一個應用程序列表。呈現給用戶的便是一個手機中安裝的應用程序列表了。
原理是不是很簡單呢?下面,就讓我們一起來實現這些功能吧。
為了更加面向對象化和體現面向對象的封裝性,我將獲取到的每一個應用程序信息封裝成了一個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; //是否是用戶app private 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; } @Override public String toString() { return AppInfo [app_icon= + app_icon + , app_name= + app_name + , app_version= + app_version + , packagename= + packagename + , isUserApp= + isUserApp + ]; } }
這個類主要實現獲取手機中安裝的應用程序的主要業務功能,封裝了如何獲取手機安裝的應用程序的方法。
具體實現代碼如下:
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 stub this.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; } }
在res/values目錄下新建styles.xml文件來定義應用程序的樣式信息,我在這個文件中主要定義個兩個樣式。
具體代碼如下:
具體實現代碼如下:
<framelayout android:layout_height="fill_parent" android:layout_width="fill_parent"> </framelayout>
具體實現代碼如下
這個類繼承自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; //動態改變appInfos public 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; } }
這個類實現的功能很簡單,調用其他類的方法,將獲取的信息顯示到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程序,默認為true private 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); //隱藏RelativeLayout rl_loading.setVisibility(View.GONE); //View.VISIBLE (控件顯示)View.INVISIBLE(控件隱藏 但占據空間) View.GONE(控件隱藏 不占據空間) break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.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程序員最基本的開發常識和規范,我在這裡只是為了方便直接寫在了類和布局文件中。
一.MVP理論簡介1.為何要在android中引入MVP??在Android項目中,Activity和Fragment占據了大部分的開發工作。而MVP設計模式可以優化Ac
Activity或View類的onTouchEvent()回調函數會接收到touch事件。一個完整的手勢是從ACTION_DOWN開始,到ACTION_UP結束。簡單的情
Android TV上的焦點凸顯特效相信大家都看到過,那麼我們就來實現它吧,首先上張效果圖。 先說一下實現原理,主要通過重寫RelativeLayout實現item,
前言 心好疼:昨晚寫完了這篇博客一半,今天編輯的時候網絡突然斷了,我的文章就這樣沒了,但是為了Developer的使用AS這款IDE可以快速上手,我還是繼續進行詳解