반응형

Manifest

 <application
        android:name=".common.RootApp"
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.Custom">

        <activity android:name=".activities.MainActivity"
            android:theme="@style/AppTheme.Custom">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_map_key" />
        <activity android:name=".activities.Maps.MapsActivity"
                  android:label="@string/google_map_label"
                  android:description="@string/google_map_description"
                  android:icon="@drawable/ic_map_black_24dp">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="com.example.testrxjava.Main.sub.category"/>
            </intent-filter>
        </activity>

        <activity android:name=".activities.shopping.ShoppingActivity"
            android:label="@string/shopping_mall_label"
            android:description="@string/shopping_mall_description"
            android:icon="@drawable/ic_shopping_cart_black_24dp">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="com.example.testrxjava.Main.sub.category"/>
            </intent-filter>
        </activity>


    </application>

 

이와같이 manifest가 구성되있다면 intent filter를 이용해 자신이 원하는 activity 그룹을 불러모을수 있습니다.

 

intent filter를 사용하기위해 만들어진 클래스인 ResolveInfo 를 사용해서 가저와 보겠습니다.

 

 

ResolveInfo

   Intent intent = new Intent();
   intent.setAction(Intent.ACTION_VIEW);
   intent.addCategory("com.example.testrxjava.Main.sub.category");
   
   PackageManager pm = context.getPackageManager();
   List<ResolveInfo> activityList = pm.queryIntentActivities(intent, 0);

예제같은 경우는 category의 이름 값으로 걸러서 가저오고 싶어서 com.example.testrxjava.Main.sub.category라는 임의의 값을 정했습니다.

 

category에 원하는값을 넣어 해당 카테고리를 가지고있는 액티비티가 있는지 질의를 합니다.

 

queryIntentActivities는 List<ResolveInfo> 형태로 액티비티 리스트를 돌려줍니다.

 

 

Util로 만들기

  public static List<AppInfoVO> getActivityList(Context context,Intent filterIntent) throws NullPointerException{
        List<AppInfoVO> list = new ArrayList<>();
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> activityList = pm.queryIntentActivities(filterIntent, 0);
        for (ResolveInfo temp : activityList) {
            list.add(
              new AppInfoVO(temp.activityInfo.name,
              context.getResources().getString(temp.activityInfo.labelRes),
              context.getResources().getString(temp.activityInfo.descriptionRes),
              temp.activityInfo.icon)
            );
        }
        return list;
}
public static List<AppInfoVO> getActivityList(Context context){
        List<AppInfoVO> list = new ArrayList<>();
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory("com.example.testrxjava.Main.sub.category");
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> activityList = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo temp : activityList) {
            list.add(
              new AppInfoVO(temp.activityInfo.name,
              context.getResources().getString(temp.activityInfo.labelRes),
              context.getResources().getString(temp.activityInfo.descriptionRes),
              temp.activityInfo.icon)
            );
        }
        return list;
}

위를 응용해 util로 따로만들어 어디서든 사용할수있게 수정할 수 있습니다. 자신의 상황에 맞춰 유틸로 만들어줍니다.

 

public class AppInfoVO {
    private String packageName;
    private String label;
    private String description;
    private int icon;

    public AppInfoVO(String packageName, String label, String description ,int icon) {
        this.packageName = packageName;
        this.label = label;
        this.description = description;
        this.icon = icon;
    }

    public String getPackageName() {
        return packageName;
    }

    public String getLabel() {
        return label;
    }

    public String getDescription() {
        return description;
    }

    public int getIcon() {
        return icon;
    }
}

AppInfoVo는 저에게 필요한 액티비티 정보를 가저올수 있도록 vo로 구성해봤습니다.

반응형

+ Recent posts