2017년 9월 4일 월요일

런처 만들기의 기본 실행할 앱을 구성하기 in Android


간단한 안드로이드 런처들 소스를 찾아보면 두가지 종류의 소스를 찾아볼 수 있습니다.

두가지 방법

1. https://github.com/arnabc/simplelauncher

2. https://code.tutsplus.com/tutorials/build-a-custom-launcher-on-android--cms-21358

두개의 차이점은 실행할 앱의 목록을 구성시키는 API 구성이 다릅니다.


첫번재 방법

1.번 방식의 소스를 살펴보면 아래 소스내 아래와 같은 부분이 있습니다.

https://github.com/arnabc/simplelauncher/blob/master/SimpleLauncher/src/main/java/ch/arnab/simplelauncher/AppsLoader.java


@Override
public ArrayList<AppModel> loadInBackground() {
// retrieve the list of installed applications
List<ApplicationInfo> apps = mPm.getInstalledApplications(0);
if (apps == null) {
apps = new ArrayList<ApplicationInfo>();
}
final Context context = getContext();
// create corresponding apps and load their labels
ArrayList<AppModel> items = new ArrayList<AppModel>(apps.size());
for (int i = 0; i < apps.size(); i++) {
String pkg = apps.get(i).packageName;
// only apps which are launchable
if (context.getPackageManager().getLaunchIntentForPackage(pkg) != null) {
AppModel app = new AppModel(context, apps.get(i));
app.loadLabel(context);
items.add(app);
}
}
// sort the list
Collections.sort(items, ALPHA_COMPARATOR);
return items;
}


mPm.getInstalledApplications(0); 이 함수에의해 전체 설치된 어플의 목록을 가져오게 되고, if (context.getPackageManager().getLaunchIntentForPackage(pkg) != null) 해당 코드에 의해 그중에 실행가능한 어플들만 목록을 채우게 됩니다.


두번째 방법

2. 번의 방식은 아래의 코드에 의해 Intent.CATEGORY_LAUNCHER, queryIntentActivities() 에 의해 Activity의 목록들이 돌아 옵니다.

private PackageManager manager;
private List<AppDetail> apps;
private void loadApps(){
    manager = getPackageManager();
    apps = new ArrayList<AppDetail>();
     
    Intent i = new Intent(Intent.ACTION_MAIN, null);
    i.addCategory(Intent.CATEGORY_LAUNCHER);
     
    List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
    for(ResolveInfo ri:availableActivities){
        AppDetail app = new AppDetail();
        app.label = ri.loadLabel(manager);
        app.name = ri.activityInfo.packageName;
        app.icon = ri.activityInfo.loadIcon(manager);
        apps.add(app);
    }
}


결론 어떤것을 사용할까?

두개모두 잘 동작은 하지만 1번의 방식은 문제가 있습니다. 하나의 어플(apk)에는 여러개의 런처 속성을 가진 Activity가 존재할 수가 있습니다. 따라서 1번 방식으로 구현을 하면 보여지지 않는 어플이 생기게 됩니다. 따라서 2번 방식으로 구현하는 것을 추천합니다.


댓글 없음:

댓글 쓰기