[独習android]アクティビティ(隠れを含む)をリストする
ACTION_MAINに反応するアクティビティをリストしてみたらランチャーや設定画面からはたどり着けないものとかあって結構おもしろい。ついでにリストビュー(ListView)の使い方も勉強した。
アクティビティ一覧を取得
- PackageManagerに問合せすることで取得する
http://developer.android.com/reference/android/content/pm/PackageManager.html - Intentを渡すことで取得するリストにフィルタをかけることができる
http://developer.android.com/reference/android/content/Intent.html#ACTION_MAIN
http://developer.android.com/reference/android/content/Intent.html#CATEGORY_LAUNCHER
List<ResolveInfo> mActivities = null; ... @Override public void onCreate(Bundle savedInstanceState) { ... // ACTION_MAINに反応する全てのアクティビティを取得する PackageManager pm = getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN, null); // 以下を設定するとランチャーから起動できるものだけに絞り込む //intent.addCategory(Intent.CATEGORY_LAUNCHER); mActivities = pm.queryIntentActivities(intent, 0); int size = mActivities.size(); ResolveInfo ri = null; for(int i=0; i<size; i++) { ri = mActivities.get(i); if (ri.activityInfo != null) { mListData.add(new ActivityInfoExt( // 後述 (String)ri.loadLabel(pm), // ラベルは個別にロードしないといけない ri.activityInfo )); } } ... }
- ResolveInfo のリストが返ってくるが、ラベルは個別に取得しないといけない
http://developer.android.com/reference/android/content/pm/ResolveInfo.html - データを格納するリストはこんな感じ
// アクティビティリストに表示するデータ private ArrayList<ActivityInfoExt> mListData = new ArrayList<ActivityInfoExt>();
リストに表示
- ListViewにデータをラップしたアダプタ(ListAdapter)を設定することで表示する
http://developer.android.com/reference/android/widget/ListView.html#setAdapter(android.widget.ListAdapter) - 実際には ListAdapter(抽象クラス)を実装した ArrayAdapter などを使う
http://developer.android.com/reference/android/widget/ArrayAdapter.html - ArrayAdapter(ジェネリッククラス)に任意の型(今回は作ったActivityInfoExt)のリストと行を表示するビュー(例では R.layout.row)を渡してオブジェクトを作る
// ListViewに行のビュー等を提供するアダプターでデータをラップし設定する mListView.setAdapter( new ArrayAdapter<ActivityInfoExt>(this, R.layout.row, mListData));
- アダプターに渡す型(ActivityInfoExt)は Serializable を実装(toString() を定義)してリストの行に表示される文字列を提供すればよい
@SuppressWarnings("serial") private class ActivityInfoExt implements Serializable { public String label; public ActivityInfo activityinfo; public ActivityInfoExt(String label, ActivityInfo activityinfo) { this.label = label; this.activityinfo = activityinfo; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(label).append("\n").append(activityinfo.name); return sb.toString(); } }
* ListView.setOnItemClickListener() を実装して、アイテム(行)をクリックした際の動作を指定する
// リストのアイテムがクリックされた際のハンドラ mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // クリック(選択)された行のデータを保存しておく mSelectedItem = mListData.get(position); mButton.setText(mSelectedItem.activityinfo.name); } });
- ListViewの行の表示に使用する独自レイアウト(row.xml)
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:padding="4dp" />
- ここでは独自レイアウトを定義しているが、標準で使えるレイアウトリソースが android.R.layout にある
http://developer.android.com/reference/android/R.layout.html
simple_list_item_1 とか simple_list_item_checked など
apk置いておきます
- ACTION_MAINなIntentに反応するアクティビティのリストを表示し、選択したアクティビティを起動するアプリです。通常たどり着けない設定画面(テスト系の画面とか)が開けたりします。
- リストからアクティビティを選択した後、一番したのボタンを押すと起動します。
- Android 2.1以降で動作します。
- たくさんパッケージを入れてるとデータ取得に時間がかかりますが、適当に実装してるのでその間(数秒)何も表示されません。
- いくつかのアクティビティ(特に電話系)は起動するとエラー出して落ちるか、端末がリブートします(SIM toolkitなるもので確認、他にもあるかも)。
- なので、よく知らないアクティビティを起動する時は覚悟を決めてからにしてください。
- 選択したアクティビティを起動した結果、何が起きても自力で対処できる人向けです。
- そして、何が起きても責任はとれません。
- それではこちらです
http://groundwalker.com/apk/gWactivityList.apk
関連情報
- 「android-dev」タグの付いたエントリ http://groundwalker.com/blog/tag/android-dev
- Android SDK関連の書籍 http://amzn.to/SS0jff
自分の Ideos U8150-B では 160個くらいのアクティビティがリストされた
Debug Intent sender 、ネットワーク系のテスト画面、充電池データなどなど、色々見つかる。