2
毎分1回更新する時計ウィジェットを作成しようとしています。IntentFilter(Intent.ACTION_TIME_TICK)を使用して時計ウィジェットが更新を停止する理由
私は、更新要求を送信するためにAlarmManagerを使用してみましたが、私はそれが完全にIntentFilter(Intent.ACTION_TIME_TICK)
ウィジェットの負荷を使用してのように正確であること、およびACTION_TIME_TICK IntentFilterを使用して約10分ほどの更新ではないと考えました...しかし、更新を停止するだけです。
ここに私のAppWidgetProviderクラスは、任意の提案は
public class ClockWidget extends AppWidgetProvider
{
private final String TAG = "ClockWidget";
private static SharedPreferences sharedPrefs;
private static SharedPreferences.Editor prefEditor;
private final String SHARED_PREF_NAME = "ClassicBlack_Prefs";
private BroadcastReceiver receiver;
@Override
public void onEnabled(Context context)
{
Log.d(TAG, "onEnabled()");
super.onEnabled(context);
sharedPrefs = context.getSharedPreferences(SHARED_PREF_NAME, 0);
prefEditor = sharedPrefs.edit();
prefEditor.putBoolean("isWatchfaceActive", true).commit();
drawWatch(context);
receiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context ctx, Intent intent)
{
if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
{
drawWatch(ctx);
}
}
};
context.getApplicationContext().registerReceiver(receiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
Log.d(TAG, "onUpdate()");
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onDisabled(Context context)
{
Log.d(TAG, "onDisabled()");
super.onDisabled(context);
sharedPrefs = context.getSharedPreferences(SHARED_PREF_NAME, 0);
prefEditor = sharedPrefs.edit();
prefEditor.putBoolean("isWatchfaceActive", false).commit();
if (receiver != null)
{
context.getApplicationContext().unregisterReceiver(receiver);
}
}
private void drawWatch(Context context)
{
Log.d(TAG, "drawWatch()");
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
ComponentName thisWidget = new ComponentName(context, ClockWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
Log.i("ExampleWidget", "Updating widgets " + Arrays.asList(allWidgetIds));
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i = 0; i < allWidgetIds.length; i++)
{
DrawWatchFace drawWatchFace = new DrawWatchFace(context, null, true, 500);
drawWatchFace.createWatchWidget();
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clock_widget_layout);
views.setImageViewBitmap(R.id.widget_canvas_imageView_small, drawWatchFace.getPalletBitmap());
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(allWidgetIds[i], views);
}
}
}
ですか?
Hmm - AppWidgetProviderクラスのマニフェストには入れていません。 – DeNitE
@DeNitE:それは分かります。あなたは 'registerReceiver()'を呼び出しています。これは、プロセスの実行中にのみ機能します。あなたのプロセスは永遠に実行されることはありません。多くのブロードキャストでは、マニフェストに登録し、実行中のプロセスがない場合でも受信できます。これは一部のブロードキャストでは不可能です。 'ACTION_TIME_TICK'はそのような放送です。 – CommonsWare
興味深い - ほとんどのウィジェットはAlarmManagerを使用して更新を継続していると思いますか?システムクロックの分とアラームを同期させる方法はありますか? – DeNitE