libro
www.tuyano.com
Google androidプログラミング入門

AppWidgetを作ろう! (10/10)

作成:2009-12-28 18:30
更新:2010-05-11 15:24

■サービス開始の流れ

では、ソースコードを見てみましょう。ここでは、onStartでサービスを開始する際の処理を行っています。これは、かなり真新しいクラスやメソッドばかりが並んでいますね。
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())) {
    btnClicked(view);
}
引数で渡されたIntentのアクションを「getAction」で取得し、それがACTION_BTNCLICKだったなら、AppWidgetに用意したボタンがクリックされたものと判断して、btnClickedメソッドを実行します。これが、ボタンのイベント処理を行う部分になるわけです。
Intent newintent = new Intent();
newintent.setAction(ACTION_BTNCLICK);
続いて、新しいIntentを用意し、「setAction」でアクションを設定します。これは何をするのかというと、「PendingIntent」というものを使ってIntentを発信させるのに使うのです。
PendingIntent pending = PendingIntent.getService(this, 0, newintent, 0);
view.setOnClickPendingIntent(R.id.button1, pending);
PendingIntentは、指定した時間や、イベントのときにIntentを発信させるのに用いられるものです。PendingIntent.getServicePendingIntentインスタンスを用意し、そしてRemoteViews「setOnClickPendingIntent」を使い、指定したViewのリソースIDにPendingIntentを設定してやります。これで、クリックしたらIntentが発信され、結果、先ほど設定したようにACTION_BTNCLICKのアクションであればbtnClickedが実行されるようになります。
ComponentName widget = new ComponentName(this, MyAppWidget.class);
manager.updateAppWidget(widget, view);
最後に、「ComponentName」というものを用意し、AppWidgetManagerAppWidgetを更新します。これで必要な処理はすべて完了しました。

ざっと見てもわかるように、AppWidgetの処理は、Activityクラスとはかなり違います。Activityはレイアウトの作成もイベント処理も非常にJavaらしい仕組みでしたが、AppWidgetはかなり違います。例えば、TextViewの表示を変更するだけでも、AppWidgetではRemoteViews「setTextViewText」なんてものを呼び出していますね。イベント処理も、サービスからIntentをViewのイベントに設定して実行されるようにしたり、とにかく考え方が違います。まずは、この独特の考え方を理解することからはじめましょう。

※プログラムリストが表示されない場合

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);
}
※関連コンテンツ

「Google androidプログラミング入門」に戻る