설치된 앱의 패키지 명을 리스트로 뿌려주고 패키지명, 이름, 이미지를 받아오는 간단한 앱을 만들어 보겠습니다.
1. 어플리케이션 정보를 담는 클래스 구현하기
public class packageinfo { public static interface AppFilter { public void init(); public boolean filterApp(ApplicationInfo info); }
// 아이콘 public Drawable mIcon = null; // 어플리케이션 이름 public String mAppNaem = null; // 패키지 명 public String mAppPackge = null;
/** * 서드파티 필터 */ public static final AppFilter THIRD_PARTY_FILTER = new AppFilter() { public void init() { }
@Override 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; } };
/** * 알파벳 이름으로 정렬 */ public static final Comparator<packageinfo> ALPHA_COMPARATOR = new Comparator<packageinfo>() { private final Collator sCollator = Collator.getInstance(); @Override public int compare(packageinfo object1, packageinfo object2) { return sCollator.compare(object1.mAppNaem, object2.mAppNaem); } }; } |
2. 패키지명 불러와 리스트로 뿌려주기
public class packagename extends Activity { private static final String TAG = packagename.class.getSimpleName(); // 메뉴 KEY private final int MENU_DOWNLOAD = 0; private final int MENU_ALL = 1; private int MENU_MODE = MENU_DOWNLOAD;
private PackageManager pm;
private View mLoadingContainer; private ListView mListView = null; private IAAdapter mAdapter = null; public static String s1text; public static String s2text; public static String s3text; public static String s4text; public static String s5text; public static String app_name; public static String package_name; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_app_info);
mLoadingContainer = findViewById(R.id.loading_container); mListView = (ListView) findViewById(R.id.listView1);
mAdapter = new IAAdapter(this); mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override public void onItemClick(AdapterView<?> av, View view, int position, long id) { // TODO Auto-generated method stub app_name = ((TextView) view.findViewById(R.id.app_name)).getText().toString(); package_name = ((TextView) view.findViewById(R.id.app_package)).getText().toString(); Toast.makeText(packagename.this, package_name, Toast.LENGTH_SHORT).show();
finish(); } }); }
@Override protected void onResume() { super.onResume();
// 작업 시작 startTask(); }
/** * 작업 시작 */ private void startTask() { new AppTask().execute(); }
/** * 로딩뷰 표시 설정 * * @param isView * 표시 유무 */ private void setLoadingView(boolean isView) { if (isView) { // 화면 로딩뷰 표시 mLoadingContainer.setVisibility(View.VISIBLE); mListView.setVisibility(View.GONE); } else { // 화면 어플 리스트 표시 mListView.setVisibility(View.VISIBLE); mLoadingContainer.setVisibility(View.GONE); } }
/** * List Fast Holder * * @author nohhs */ private class ViewHolder { //그대로 뷰들을 홀더에 꼽아놓듯이 보관하는 객체 각각의 열을 뽑아내려고 할 때 findViewById를 호출하여 열의 속성을 변경할 수 있습니다. // App Icon public ImageView mIcon; //아이콘 // App Name public TextView mName; // 앱 명 // App Package Name public TextView mPacakge; //앱 패키지 이름 } /** * List Adapter * * @author nohhs */ private class IAAdapter extends BaseAdapter { private Context mContext = null;
private List<ApplicationInfo> mAppList = null; private ArrayList<packageinfo> mListData = new ArrayList<packageinfo>();
public IAAdapter(Context mContext) { super(); this.mContext = mContext; }
public int getCount() { return mListData.size(); }
public Object getItem(int arg0) { return null; }
public long getItemId(int arg0) { return 0; }
public View getView(int position, View convertView, ViewGroup parent) { // Viewholder 사용하는 부분입니다. ViewHolder holder;
// 캐시된 뷰가 없을 경우 새로 생성하고 뷰홀더를 생성한다 if (convertView == null) { holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item_layout, null);
holder.mIcon = (ImageView) convertView //레이아웃의 값을 Viewholder에 넣어둠니다. .findViewById(R.id.app_icon); holder.mName = (TextView) convertView .findViewById(R.id.app_name); holder.mPacakge = (TextView) convertView .findViewById(R.id.app_package);
convertView.setTag(holder);
}//캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용합니다. else { holder = (ViewHolder) convertView.getTag(); }
packageinfo data = mListData.get(position);
if (data.mIcon != null) { holder.mIcon.setImageDrawable(data.mIcon); }
holder.mName.setText(data.mAppNaem); holder.mPacakge.setText(data.mAppPackge);
return convertView; }
/** * 어플리케이션 리스트 작성입니다. */ public void rebuild() { if (mAppList == null) {
Log.d(TAG, "Is Empty Application List"); // 패키지 매니저 취득합니다. pm = packagename.this.getPackageManager();
// 설치된 어플리케이션 취득합니다. mAppList = pm .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS); }
AppFilter filter; switch (MENU_MODE) { case MENU_DOWNLOAD: filter = packageinfo.THIRD_PARTY_FILTER; break; default: filter = null; break; }
if (filter != null) { filter.init(); }
// 기존 데이터 초기화합니다. mListData.clear();
packageinfo addInfo = null; ApplicationInfo info = null; for (ApplicationInfo app : mAppList) { info = app;
if (filter == null || filter.filterApp(info)) { // 필터된 데이터
addInfo = new packageinfo(); // App Icon addInfo.mIcon = app.loadIcon(pm); // 패키지 매니저에서 가져온 값 넣습니다. // App Name addInfo.mAppNaem = app.loadLabel(pm).toString(); // App Package Name addInfo.mAppPackge = app.packageName; mListData.add(addInfo); } }
// 알파벳 이름으로 소트(한글, 영어) Collections.sort(mListData, packageinfo.ALPHA_COMPARATOR); } }
/** * 작업 태스크 * @author nohhs */ private class AppTask extends AsyncTask<Void, Void, Void> {
@Override protected void onPreExecute() { // 로딩뷰 시작합니다. setLoadingView(true); }
@Override protected Void doInBackground(Void... params) { // 어플리스트 작업시작합니다. mAdapter.rebuild();
return null; }
@Override protected void onPostExecute(Void result) { // 어댑터 갱신합니다. mAdapter.notifyDataSetChanged();
// 로딩뷰 정지합니다. setLoadingView(false); }
};
@Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_DOWNLOAD, 1, R.string.menu_download); menu.add(0, MENU_ALL, 2, R.string.menu_all);
return true; }
@Override public boolean onPrepareOptionsMenu(Menu menu) { if (MENU_MODE == MENU_DOWNLOAD) { menu.findItem(MENU_DOWNLOAD).setVisible(false); menu.findItem(MENU_ALL).setVisible(true); } else { menu.findItem(MENU_DOWNLOAD).setVisible(true); menu.findItem(MENU_ALL).setVisible(false); }
return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { int menuId = item.getItemId();
if (menuId == MENU_DOWNLOAD) { MENU_MODE = MENU_DOWNLOAD; } else { MENU_MODE = MENU_ALL; }
startTask();
return true; } }
|
기본 앱 패키지명 외의 모든 앱의 패키지명과 이름을 불러 올 수 있는 소스를 구현해 보았습니다.
[사용한 함수]
Viewholder : 이름 그대로 뷰들을 홀더에 꼽아놓듯이 보관하는 객체를 말합니다. 각각의 Row를 그려낼 때 그 안의 위젯들의 속성을 변경하기 위해 findViewById를 호출하는데 이것의 비용이 큰것을 줄이기 위해 사용합니다. View의 각 row 값을 추출해 낼 때 사용하면 됩니다.
PackageManager : 이 함수를 이용하여 설치된 패키지 명을 추출할 수 있습니다.
이미지는 따로 첨부하지 않겠습니다.