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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

4276閲覧

Androidウィジェットを細かい間隔で更新させたい

minagiduki

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/11 06:14

編集2020/05/13 00:47

前提・実現したいこと

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です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

updatePeriodMillisとかAlarmManagerは目的が違うように思います。
目覚まし時計のアラームをセットするようなものなので時計の秒針を動かす目的には使えないと思います。

TimerやTimerTaskで試してみてください。
https://akira-watson.com/android/timertask.html
https://android-java.hatenablog.jp/entry/2018/09/27/195007

投稿2020/05/31 05:38

shun-K

総合スコア508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minagiduki

2020/06/01 07:33

回答ありがとうございます。 少し調べてみたのですが、見つかる情報がMainActivityに実装しているものばかりでした。 可能であれば上記ウィジェットクラスの中に実装したいのですが可能でしょうか?
minagiduki

2020/06/02 07:43

補足ありがとうございます! これで試してみようと思います。 完成はしていませんが取り急ぎベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問