前提・実現したいこと
Android Studioを使用して時計ウィジェットを制作しています。
updatePeriodMillisによる自動更新は動作するのですが、
AlarmManagerを使用して細かい間隔での更新をさせようと
ネット上のサンプルプログラムを追加して見たところ、
エラーは発生しないものの時計は動かないままとなっています。
(updatePeriodMillisの更新は発生する)
希望としては1分以下(理想は毎秒)での更新を実装したいです。
アプリ開発は初心者のためもしかしたら初歩的なミスがどこかであるのかもしれませんが、
ご教示いただければと思います。
該当のソースコード
java
1package test.test.test; 2 3import android.app.AlarmManager; 4import android.app.PendingIntent; 5import android.appwidget.AppWidgetManager; 6import android.appwidget.AppWidgetProvider; 7import android.content.Context; 8import android.content.Intent; 9import android.widget.RemoteViews; 10 11import androidx.core.content.ContextCompat; 12 13import java.util.Objects; 14 15public class WidgetSample extends AppWidgetProvider { 16 static String[][] calendar_data; 17 static RemoteViews views; 18 19 static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 20 21 //自作クラスで時間データを取得(実際のウィジェットの仕様のため2次元配列で取得しています) 22 calendar_data = GetCalendar.getcalendar(); 23 24 views = new RemoteViews(context.getPackageName(), R.layout.widget_sample); 25 views.setTextViewText(R.id.appwidget_year, calendar_data[0][0]); 26 views.setTextViewText(R.id.appwidget_month, calendar_data[0][1]); 27 views.setTextViewText(R.id.appwidget_month_txt, calendar_data[1][1]); 28 views.setTextViewText(R.id.appwidget_date, calendar_data[0][2]); 29 views.setTextViewText(R.id.appwidget_day, calendar_data[1][2]); 30 views.setTextViewText(R.id.appwidget_hour, calendar_data[0][3]); 31 views.setTextViewText(R.id.appwidget_minute, calendar_data[0][4]); 32 33 if(calendar_data[1][2].equals("SAT")) { 34 views.setTextColor(R.id.appwidget_date, ContextCompat.getColor(context, R.color.text_sky)); 35 views.setTextColor(R.id.appwidget_day, ContextCompat.getColor(context, R.color.text_sky)); 36 } 37 else if(calendar_data[1][2].equals("SUN")){ 38 views.setTextColor(R.id.appwidget_date, ContextCompat.getColor(context, R.color.text_pink)); 39 views.setTextColor(R.id.appwidget_day, ContextCompat.getColor(context, R.color.text_pink)); 40 } 41 42 appWidgetManager.updateAppWidget(appWidgetId, views); 43 } 44 45 @Override 46 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 47 for (int appWidgetId : appWidgetIds) { 48 updateAppWidget(context, appWidgetManager, appWidgetId); 49 } 50 } 51 52 @Override 53 public void onReceive(Context context, Intent intent) { 54 String action = intent.getAction(); 55 if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) { 56 setAlarm(context); 57 Intent serviceIntent = new Intent(context, WidgetSample.class); 58 // context.stopService(serviceIntent); 59 context.startService(serviceIntent); 60 } 61 super.onReceive(context, intent); 62 } 63 64 @Override 65 public void onDisabled(Context context) { 66 AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 67 PendingIntent sender = getPendingAlarmIntent(context); 68 Objects.requireNonNull(am).cancel(sender); 69 super.onDisabled(context); 70 } 71 72 private PendingIntent getPendingAlarmIntent(Context context) { 73 Intent intent = new Intent(context, WidgetSample.class); 74 intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 75 PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 76 return pendingIntent; 77 } 78 79 private void setAlarm(Context context) { 80 Intent alarmIntent = new Intent(context, WidgetSample.class); 81 alarmIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 82 AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 83 long now = System.currentTimeMillis() + 1; 84 int interval = 1000; 85// PendingIntent operation = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 86// Objects.requireNonNull(am).setRepeating(AlarmManager.RTC, now, interval, operation); 87 long nextTime = now + interval - now % 1000; 88 PendingIntent sender = getPendingAlarmIntent(context); 89 Objects.requireNonNull(am).setExact(AlarmManager.RTC_WAKEUP, nextTime, sender); 90 } 91}
試したこと
setAlarmのコメントアウトしている2行の方に変更しても同様です。
補足情報(FW/ツールのバージョンなど)
Android Studio 3.6.3
SDKはTarget29、min21です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/01 07:33
2020/06/01 12:53
2020/06/02 07:43