ショートカット作成
アプリ上の操作でショートカットを作成
Androidのサンプルソースcom.example.android.apis.app.LauncherShortcutsのsetupShortcutメソッドが参考になると思います。起動するActivitiyは
shortcutIntent.setClassName(this, this.getClass().getName());このコードは自分自身を起動するようにしてます。
何かキーと一緒に作成する場合は
shortcutIntent.putExtra(EXTRA_KEY, "ApiDemos Provided This Shortcut");の所に設定すればいいと思います。これを起動したActivityのonCreate()で
String extra = intent.getStringExtra(EXTRA_KEY);のように取得できます。
ウィジェットから作成
Androidの画面のはんこ注射みたいなマークのアイコンで表示されるウィジェット一覧の中から選択してショートカットを作成する場合です。先ほどのLauncherShortcuts.javaというActivityのショートカットをウィジェット一覧に載せたい場合はAndroidManifest.xmlに以下のように記述すれば良いです。
<activity-alias android:name=".app.CreateShortcuts" android:targetActivity=".app.LauncherShortcuts" android:label="@string/sample_shortcuts"> <!-- This intent-filter allows your shortcuts to be created in the launcher. --> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity-alias>
アプリをインストールするとウィジェット一覧に反映されます。これをAndroidの画面へドラッグアンドドロップするとLauncherShortcuts.javaのショートカットを作成する処理が実行されます。その後、ショートカットをタッチすると、LauncherShortcuts.javaの画面が起動します。
ウィジェットの作成
上記はアイコンが作成されるタイプですが、画面上にボタンや図などのViewを配置したい場合のやり方です。サンプルソースのcom.example.android.apis.appwidgetあたりが参考になるかと思います。ExampleAppWidgetProvider.javaに書いてありますが、基本的なファイル構成は- ExampleAppWidgetConfigure.java (ウィジェット設定用のActivity)
- ExampleAppWidgetProvider.java (ウィジェットに対する処理)
- ExampleBroadcastReceiver.java (詳しくは調べてませんが、ExampleAppWidgetProviderkaからメッセージ受け取る用)
- res/layout/appwidget_configure.xml (Activity用のレイアウトxml)
- res/layout/appwidget_provider.xml (ウィジェットのレイアウトxml)
- res/xml/appwidget_provider.xml (ウィジェットの大きさや更新時間などを記述するxml)
- AndroidManifest.xmlへの追記
ウィジェット一覧からドラッグアンドドロップをすると、ウィジェットの設定用画面が開きます。その時に起動しているのが、ExampleAppWidgetConfigure.javaというActivityなのですが、これは動的に起動しているわけではなくて、appwidget_provider.xmlに
android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure"と記述することで行っています。その他の話はウィジェットの作成を解説するサイトで書かれてると思うので割愛します。
ListViewのウィジェット
GTasksアプリなどはListViewのようなリストをウィジェットとして配置できますが、その場合はこちらが参考になります。このソースだと、リストをタッチした場合のイベントは記述されていません。そのような処理を書きたい場合は、WidgetProviderのonUpdate()より下を
というように書き換えてやり、ListProvider.javaのgetViewAt()でsetOnClickFillInIntentを設定してやると、
先ほどのonReceive()のintentで情報を受け取る事ができます。
例えば、タッチしたリストのアイコンを変更するような挙動にする場合、onReceive()メソッドのposでリストの位置を取得できますが、ListProvider.javaのlistItemListの値をどうやって(スマートに)書き換えてやるかが、まだ検証しきれてません。どうにかしてデータの変更ができたなら、
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.listView1);でリストをリフレッシュすれば反映されます。
その他
ウィジェットのユニットテストは検索してもあまり出てこないので、テストし辛い箇所なのかなと思っている次第です。テストには、AndroidTestCaseを使うみたいな記述を見かけましたが、ロジック部分を切り出してテストをするのがいいかなと思っているところです。とりあえず動かしてみたところまでのメモでまた修正とかあったら記述します。追記:2015/02/04
記事内のソースファイルへのリンクがうまくリンクしてなかったので修正。
コメント
コメントを投稿