AppWidgetを作ろう! (10/10)
作成:2009-12-28 18:30
更新:2010-05-11 15:24
更新:2010-05-11 15:24
■サービス開始の流れ
では、ソースコードを見てみましょう。ここでは、onStartでサービスを開始する際の処理を行っています。これは、かなり真新しいクラスやメソッドばかりが並んでいますね。
ざっと見てもわかるように、AppWidgetの処理は、Activityクラスとはかなり違います。Activityはレイアウトの作成もイベント処理も非常にJavaらしい仕組みでしたが、AppWidgetはかなり違います。例えば、TextViewの表示を変更するだけでも、AppWidgetではRemoteViewsの「setTextViewText」なんてものを呼び出していますね。イベント処理も、サービスからIntentをViewのイベントに設定して実行されるようにしたり、とにかく考え方が違います。まずは、この独特の考え方を理解することからはじめましょう。
AppWidgetManager manager = AppWidgetManager.getInstance(this);まず、「AppWidgetManager」というものを用意します。これは、AppWidgetを管理するためのクラスです。このクラスは、Serviceインスタンス(this)を引数に渡してAppWidgetManager.getInstanceを呼び出し取得します。
RemoteViews view = new RemoteViews(getPackageName(), R.layout.appwidget);続いて、「RemoteViews」というインスタンスを用意します。これは名前の通り、リモートでアクセスされるViewです。これは引数にパッケージ名とリソースのレイアウトIDを渡します。これにより、指定のレイアウトにリモートでアクセスするためのRemoteViewsが用意されます。
if (ACTION_BTNCLICK.equals(intent.getAction())) {引数で渡されたIntentのアクションを「getAction」で取得し、それがACTION_BTNCLICKだったなら、AppWidgetに用意したボタンがクリックされたものと判断して、btnClickedメソッドを実行します。これが、ボタンのイベント処理を行う部分になるわけです。
btnClicked(view);
}
Intent newintent = new Intent();続いて、新しいIntentを用意し、「setAction」でアクションを設定します。これは何をするのかというと、「PendingIntent」というものを使ってIntentを発信させるのに使うのです。
newintent.setAction(ACTION_BTNCLICK);
PendingIntent pending = PendingIntent.getService(this, 0, newintent, 0);PendingIntentは、指定した時間や、イベントのときにIntentを発信させるのに用いられるものです。PendingIntent.getServiceでPendingIntentインスタンスを用意し、そしてRemoteViewsの「setOnClickPendingIntent」を使い、指定したViewのリソースIDにPendingIntentを設定してやります。これで、クリックしたらIntentが発信され、結果、先ほど設定したようにACTION_BTNCLICKのアクションであればbtnClickedが実行されるようになります。
view.setOnClickPendingIntent(R.id.button1, pending);
ComponentName widget = new ComponentName(this, MyAppWidget.class);最後に、「ComponentName」というものを用意し、AppWidgetManagerでAppWidgetを更新します。これで必要な処理はすべて完了しました。
manager.updateAppWidget(widget, view);
ざっと見てもわかるように、AppWidgetの処理は、Activityクラスとはかなり違います。Activityはレイアウトの作成もイベント処理も非常にJavaらしい仕組みでしたが、AppWidgetはかなり違います。例えば、TextViewの表示を変更するだけでも、AppWidgetではRemoteViewsの「setTextViewText」なんてものを呼び出していますね。イベント処理も、サービスからIntentをViewのイベントに設定して実行されるようにしたり、とにかく考え方が違います。まずは、この独特の考え方を理解することからはじめましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); AppWidgetManager manager = AppWidgetManager.getInstance(this); RemoteViews view = new RemoteViews(getPackageName(), R.layout.appwidget); if (ACTION_BTNCLICK.equals(intent.getAction())) { btnClicked(view); } Intent newintent = new Intent(); newintent.setAction(ACTION_BTNCLICK); PendingIntent pending = PendingIntent.getService(this, 0, newintent, 0); view.setOnClickPendingIntent(R.id.button1, pending); ComponentName widget = new ComponentName(this, MyAppWidget.class); manager.updateAppWidget(widget, view); }
※関連コンテンツ