« 9月1日のトレーニング | トップページ | 9月2日のトレーニング »

2010年9月 2日 (木)

AppWidgetの使い方

今日はAppWidgetの利用方法について整理しておきたいと思います。

まずは、AndroidManifest.xml。

    <receiver android:name="ImageWidget">

        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/imagewidgetprovider">
        </meta-data>
    </receiver>
<activity android:name="ImageConfiguration" android:icon="@drawable/icon" android:label="@string/app_name">
    <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"></action>
    </intent-filter>
</activity>

次に、res/xmlディレクトリにappwidget-providerのxmlを作成する。

<appwidget-provider

  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="146dp"
  android:minHeight="146dp"
  android:initialLayout="@layout/widget"
  android:configure="jp.ievolution.remoteviewsample2.ImageConfiguration"
  >
</appwidget-provider>

android:configureは設定画面が必要であれば追加しておく。

更新タイミングはandroid:updatePeriodMillisで設定可能。

次に設定画面Activityを実装。このサンプルは設定画面で更新間隔を

設定してwidgetを更新させる(つもり)。

package jp.ievolution.remoteviewsample2;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ImageConfiguration extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        Log.d("remoteviewsample2", "ImageConfiguration start");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        EditText txt = (EditText)findViewById(R.id.txtTime);
        txt.setText("0");
       
        Button btn = (Button)findViewById(R.id.btnSet);
        btn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                EditText txt = (EditText)findViewById(R.id.txtTime);
                int updateRateSeconds = Integer.parseInt(txt.getText().toString());
                int appWidgetId = getIntent().getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
               
                Intent intent = new Intent();
                intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
                intent.setData(Uri.parse("imagewidget://update/" + appWidgetId));
               
                PendingIntent newPending = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
               
                AlarmManager alarm = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updateRateSeconds * 1000, newPending);
               
                Log.d("remoteviewsample2", "alarm set: " + updateRateSeconds + "seconds");
               
                Intent resultValue = new Intent();
                resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
                setResult(RESULT_OK, resultValue);
               
                finish();
            }
        });
    }
}

そして、AppWidgetProvider#onUpdateで2枚の画像を切り替える(つもり)。

package jp.ievolution.remoteviewsample2;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.RemoteViews;

public class ImageWidget extends AppWidgetProvider {
   
    @Override
    public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
        Log.d("remoteviewsample2", "onUpdate start");
       
        SharedPreferences preference = context.getSharedPreferences("imagewidget", Context.MODE_PRIVATE);
        boolean bCheck = preference.getBoolean("check", false);
        SharedPreferences.Editor edit = context.getSharedPreferences("imagewidget", Context.MODE_PRIVATE).edit();
        edit.putBoolean("check", bCheck);
        edit.commit();
       
        for(int appWidgetId : appWidgetIds) {
            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget);
            remoteView.setImageViewResource(R.id.image, (bCheck) ? R.drawable.image : R.drawable.no_image);
            manager.updateAppWidget(appWidgetId, remoteView);
        }
        Log.d("remoteviewsample2", "onUpdate end");
    }   
   
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("remoteviewsample2", "onReceive start");
        super.onReceive(context, intent);
        Log.d("remoteviewsample2", "onReceive end");
    }
}

と、こんな感じで、画像は表示できたんだけど、AlarmManagerがうまく動作していないようで、画像が切り替わる様子を見る事はできなかった。

何が悪いのかよく分からないけれども、とりあえずメモ。

(継続して調査しないとわからんですね)

|

« 9月1日のトレーニング | トップページ | 9月2日のトレーニング »

Android」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/50625/49325103

この記事へのトラックバック一覧です: AppWidgetの使い方:

« 9月1日のトレーニング | トップページ | 9月2日のトレーニング »