質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

解決済

[Android]AppWidgetProviderでAlarmManager#setRepeatingがリピートしない

Daiki-Kawanuma
Daiki-Kawanuma

総合スコア29

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

2回答

2リアクション

1クリップ

5777閲覧

投稿2015/12/07 05:12

編集2015/12/09 15:42

自作ウィジェットを作っております。1秒おきにカウントダウンをしたいのでAppWidgetProvider内でAlarmManager#setRepeatingを呼び出し更新させています。テスト環境はNexus 5X Android 6.0です。以下コードになります。

AppWidgetProvider

public class MyWidget extends AppWidgetProvider { public static final String IMAGE_CLICKED = "ImageClicked"; public static final String COUNTDOWN_OPERATION = "CountdownOperation"; public static boolean DOES_RUN_COUNTDOWN; public static final String UPDATE_TIMETABLE_OPERATION = "UpdateTimeTableOperation"; private final int INTERVAL_COUNTDOWN = 1000; private final int INTERVAL_UPDATE_TIMETABLE = 1000 * 60 * 10; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { DOES_RUN_COUNTDOWN = false; RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.bustimetable_widget); ComponentName watchWidget = new ComponentName(context, BusTimetableWidget.class); remoteViews.setOnClickPendingIntent( R.id.imageView_bus, getPendingIntentBroadcast(context, IMAGE_CLICKED) ); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.bustimetable_widget); ComponentName watchWidget = new ComponentName(context, BusTimetableWidget.class); if(intent.getAction().equals(IMAGE_CLICKED)){ if(DOES_RUN_COUNTDOWN){ DOES_RUN_COUNTDOWN = false; Toast.makeText(context, "IMAGE_CLICKED: " + DOES_RUN_COUNTDOWN, Toast.LENGTH_LONG).show(); cancelCountdownAlarm(context); } else { DOES_RUN_COUNTDOWN = true; Toast.makeText(context, "IMAGE_CLICKED: " + DOES_RUN_COUNTDOWN, Toast.LENGTH_LONG).show(); setCountdownAlarm(context); } } else if(intent.getAction().equals(UPDATE_TIMETABLE_OPERATION)){ Toast.makeText(context, "UPDATE_TIMETABLE_OPERATION: " + Calendar.getInstance().getTime(), Toast.LENGTH_LONG).show(); } else if(intent.getAction().equals(COUNTDOWN_OPERATION)){ remoteViews.setTextViewText(R.id.textView_fore_count, "n: " + count++); // Toast.makeText(context, "COUNTDOWN_OPERATION: " + Calendar.getInstance().getTime(), Toast.LENGTH_SHORT).show(); } appWidgetManager.updateAppWidget(watchWidget, remoteViews); super.onReceive(context, intent); } private void setCountdownAlarm(Context context) { PendingIntent operation = getPendingIntentService(context, COUNTDOWN_OPERATION); AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); long firstTime = System.currentTimeMillis() + 1000 * 3; alarmManager.setRepeating(AlarmManager.RTC, firstTime, INTERVAL_COUNTDOWN, operation); } private void cancelCountdownAlarm(Context context){ AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent operation = getPendingIntentService(context, COUNTDOWN_OPERATION); alarmManager.cancel(operation); } protected PendingIntent getPendingIntentService(Context context, String action) { Intent intent = new Intent(context, getClass()); intent.setAction(action); return PendingIntent.getService(context, 0, intent, 0); } }

widget_info.xml

<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialKeyguardLayout="@layout/bustimetable_widget" android:initialLayout="@layout/bustimetable_widget" android:minHeight="40dp" android:minWidth="40dp" android:previewImage="@drawable/bus_image" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="0" android:widgetCategory="home_screen"/>

Manifest

<intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="CountdownOperation" /> <action android:name="UpdateTimeTableOperation" /> <action android:name="ImageClicked"/> </intent-filter>

ImageViewのクリックに応じてカウントダウンをスタート、キャンセルする形を取っています。
現状、ImageViewのクリックには即時反応するのですが、カウントダウンは更新が呼ばれていません。おそらくAlarmManagerの使い方が間違っているのではないかと思うのですが、ご指南よろしくお願いします。

KiyoshiMotoki👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。