スキップしてメイン コンテンツに移動

androidのショートカットとウィジェットまわりのメモ

ショートカット作成

アプリ上の操作でショートカットを作成

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
記事内のソースファイルへのリンクがうまくリンクしてなかったので修正。

コメント

このブログの人気の投稿

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

Eclipseで一通り基本的なGitを使ってみる

備忘録的にまとめておきたいと思います。おかしな点があればご指摘いただければ幸いです。 目次 環境 プロジェクト作成~初コミットまで コミットの履歴&差分を見る 元に戻す ブランチについて ブランチを作成してみる ブランチを統合するには マージする Rebaseする ローカルリポジトリからプロジェクトを取り込む コミットしたメッセージの修正 環境 Eclipse IDE for Java Developers:Juno Service Release 1 Git:上記Eclipseのプリインストール版