Intereting Posts
Использование методов пользовательских запросов с Android Позиционирование EditText над клавиатурой Лямбда-выражения разбиваются с помощью IncompatibleClassChangeError в Android при использовании разъема Как всегда отображать вкладки ActionBar ниже ActionBar в Android Удаление фонового рисунка в андроиде Создание пользовательских кнопок со значком и текстом Конструкция андроида позволяет прокручивать, когда открыта мягкая клавиатура, но не сдвигает ее вверх Неподдерживаемый метод: InstantRun.getRestartDexFile () – Android Studio Android AssertJ 1.0.0 с Android-градиентом 1.1.1 Калибровка датчика магнитного поля на ANDROID! Не удалось запустить приложение, вызывая URL-адрес из Android-браузера Использование цветов из color.xml в java-коде Как реализовать сенсорный прослушиватель на изображении? PercentRelativeLayout более совершенен? Процесс «команда» F: \ android-sdk \ build-tools \ 21.1.2 \ aapt.exe '' завершен с ненулевым значением выхода 1

Обновление Android Widget

На основе этого урока я создал виджет, который должен показывать время. Работа java работает, но сервисный путь не работает.

HelloWidget.java:

public class HelloWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Intent intent = new Intent(context, UpdateService.class); context.startService(intent); } 

UpdateService.java:

 public final class UpdateService extends Service { @Override public void onStart(Intent intent, int startId) { RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.main); Date date = new Date(); java.text.DateFormat format = SimpleDateFormat.getTimeInstance( SimpleDateFormat.MEDIUM, Locale.getDefault()); updateViews.setTextViewText(R.id.widget_textview, "Current Time " + format.format(date)); ComponentName thisWidget = new ComponentName(this, HelloWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, updateViews); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } 

}

У hello_widget_provider.xml есть эта строка: android: updatePeriodMillis = "1000"

Проблема: виджет показывает текущее время, но не обновляется (java-way is).

Моя главная цель – обновлять виджет, например, 18:56 каждый день. Idk, если это хороший способ, но я попытался изменить метод onUpdate, как показано ниже, но у него есть проблема с ALARM_SERVICE: ALARM_SERVICE не может быть разрешено переменной

 public class HelloWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { AlarmManager alarmManager; Intent intent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 18); cal.set(Calendar.MINUTE, 56); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 86400, pendingIntent); 

}}

Любая помощь приветствуется.

Solutions Collecting From Web of "Обновление Android Widget"

Оглядываясь назад, когда я задавал этот вопрос, я понимаю, насколько я узнал за последние 1,5 года.

Поскольку я только что работал с виджетами за последние две недели, и я только что нашел этот неотвеченный вопрос, я решил его решить. Надеюсь, это поможет другим.

AppWidgetProvider должен выглядеть так:

 public class MyWidget extends AppWidgetProvider { public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; private PendingIntent service = null; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); final Calendar TIME = Calendar.getInstance(); TIME.set(Calendar.MINUTE, 0); TIME.set(Calendar.SECOND, 0); TIME.set(Calendar.MILLISECOND, 0); final Intent i = new Intent(context, MyService.class); if (service == null) { service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); } m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), 1000 * 1, service); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } @Override public void onDisabled(Context context) { super.onDisabled(context); final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); if (service != null) { m.cancel(service); } } @Override public void onEnabled(Context context) { super.onEnabled(context); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } } 

Обслуживание:

 public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { buildUpdate(); return super.onStartCommand(intent, flags, startId); } private void buildUpdate() { String lastUpdated = DateFormat.format("hh:mm:ss", new Date()).toString(); RemoteViews view = new RemoteViews(getPackageName(), R.layout.widget_layout); view.setTextViewText(R.id.btn_widget, lastUpdated); ComponentName thisWidget = new ComponentName(this, MyWidget.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(thisWidget, view); } @Override public IBinder onBind(Intent intent) { return null; } } 

Также зарегистрируйте поставщика и службу в манифесте:

 <receiver android:name="MyWidget" android:label="Tutorial_Widget 1x1"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="com.something.MyWidget.ACTION_WIDGET_RECEIVER"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/> </receiver> <service android:enabled="true" android:name=".MyService" /> 

ALARM_SERVICE – это статическое поле класса Context. Поэтому введите Context.ALARM_SERVICE или используйте статический импорт.

Помните, что когда вы устанавливаете значение атрибута updatePeriodMillis, это не гарантируется для того, чтобы ваш метод onUpdate был вызван именно с этим периодом.