설치된 앱의 패키지 명을 리스트로 뿌려주고 패키지명, 이름, 이미지를 받아오는 간단한 앱을 만들어 보겠습니다.




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 : 이 함수를 이용하여 설치된 패키지 명을 추출할 수 있습니다.





이미지는 따로 첨부하지 않겠습니다.

+ Recent posts