[独習android]アクティビティ(隠れを含む)をリストする

Posted November 15th, 2010 in General. Tagged: , .

ACTION_MAINに反応するアクティビティをリストしてみたらランチャーや設定画面からはたどり着けないものとかあって結構おもしろい。ついでにリストビュー(ListView)の使い方も勉強した。

アクティビティ一覧を取得

    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
        				));
        	}
        }
...
    }

	// アクティビティリストに表示するデータ
	private ArrayList<ActivityInfoExt> mListData = new ArrayList<ActivityInfoExt>();

リストに表示

        // 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"
/>

apk置いておきます

  • ACTION_MAINなIntentに反応するアクティビティのリストを表示し、選択したアクティビティを起動するアプリです。通常たどり着けない設定画面(テスト系の画面とか)が開けたりします。
  • リストからアクティビティを選択した後、一番したのボタンを押すと起動します。
  • Android 2.1以降で動作します。
  • たくさんパッケージを入れてるとデータ取得に時間がかかりますが、適当に実装してるのでその間(数秒)何も表示されません。
  • いくつかのアクティビティ(特に電話系)は起動するとエラー出して落ちるか、端末がリブートします(SIM toolkitなるもので確認、他にもあるかも)。
  • なので、よく知らないアクティビティを起動する時は覚悟を決めてからにしてください。
  • 選択したアクティビティを起動した結果、何が起きても自力で対処できる人向けです。
  • そして、何が起きても責任はとれません。
  • それではこちらです
    http://groundwalker.com/apk/gWactivityList.apk

関連情報

Posted November 15th, 2010 in General. Tagged: , .

2 comments:

  1. 自分の Ideos U8150-B では 160個くらいのアクティビティがリストされた

    groundwalker:
  2. Debug Intent sender 、ネットワーク系のテスト画面、充電池データなどなど、色々見つかる。

    groundwalker:

track feed