Как сделать ежесекундное обновление виджета?
Добавлено: 13 фев 2015, 18:55
Здравствуйте, делаю виджет на подобии часов, он должен каждую секунду менять значения в своих textview.
Я пересмотрел всё, и русскоязычные, и англоязычные гайды, пытался делать бесконечный цикл с задержкой в секунду, но виджет работал только на эмуляторе genymotion android 4.4.4(SGS5), в случае с бесконечным циклом начинал работать непонятно когда, а в последней версии работает вроде сразу, но на телефоне, сколько не жди, не выходит текст.
вот код моей последней попытки:
MyWidget.java
layout/widget.xml
xml/widget_metadata.xml
AndroidManifest.xml
аналогичное приложение(не виджет) я создал, с бесконечным циклом, и оно на телефоне прекрасно работает.
делал всё это по урокам 118-122, ещё есть просьба поподробнее в уроках описать intent, pendingintent, хотя, возможно, просто я не могу понять.
код в моём приложении частично скопирован с http://startandroid.ru/ru/uroki/vse-uro ... lenie.html
это я уже отчаялся и начал копировать
Я пересмотрел всё, и русскоязычные, и англоязычные гайды, пытался делать бесконечный цикл с задержкой в секунду, но виджет работал только на эмуляторе genymotion android 4.4.4(SGS5), в случае с бесконечным циклом начинал работать непонятно когда, а в последней версии работает вроде сразу, но на телефоне, сколько не жди, не выходит текст.
вот код моей последней попытки:
MyWidget.java
Код: Выделить всё
package com.example.myapplication4.app;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.app.PendingIntent;
import android.app.AlarmManager;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class MyWidget extends AppWidgetProvider {
final String UPDATE_ALL_WIDGETS = "update_all_widgets";
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Intent intent = new Intent(context, MyWidget.class);
intent.setAction(UPDATE_ALL_WIDGETS);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
1000, pIntent);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
Intent intent = new Intent(context, MyWidget.class);
intent.setAction(UPDATE_ALL_WIDGETS);
PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equalsIgnoreCase(UPDATE_ALL_WIDGETS)) {
ComponentName thisAppWidget = new ComponentName(
context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for (int appWidgetID : ids) {
updateWidget(context, appWidgetManager, appWidgetID);
}
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
static void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetID) {
try {
RemoteViews widgetView = new RemoteViews(context.getPackageName(), R.layout.widget);
widgetView.setTextViewText(R.id.tv1, getPeriod().getName());
final String result;
if (getPeriod().getEnd() - getMinutes() < 0)
result = "осталось " + (getPeriod().getEnd() + 1440 - getMinutes()) + "." + (60 - new GregorianCalendar().get(Calendar.SECOND)) + " минут";
else
result = "осталось " + (getPeriod().getEnd() - getMinutes()) + "." + (60 - new GregorianCalendar().get(Calendar.SECOND)) + " минут";
widgetView.setTextViewText(R.id.tv2, result);
appWidgetManager.updateAppWidget(widgetID, widgetView);
}
catch (Exception e)
{
e.printStackTrace();
}
}
static class Period {
private String name;
private int start;
private int end;
public Period(String name, int start, int end) {
this.name = name;
this.start = start;
this.end = end;
}
public String getName()
{
return this.name;
}
public int getStart()
{
return this.start;
}
public int getEnd()
{
return this.end;
}
}
static public int getMinutes() {
Calendar a = new GregorianCalendar();
a.setTime(new Date(System.currentTimeMillis()));
return a.get(Calendar.HOUR_OF_DAY)*60+a.get(Calendar.MINUTE);
}
static public Period getPeriod() {
Period[] Periods = new Period[] {
new Period("1ый урок", 480, 520), // 8.00 8.40
new Period("1ая перемена", 520, 525), // 8.40 8.45
new Period("2ой урок", 525, 565), // 8.45 9.25
new Period("2ая перемена", 565, 575), // 9.25 9.35
new Period("3ий урок", 575, 615), // 9.35 10.15
new Period("3я перемена", 615, 630), // 10.15 10.30
new Period("4ый урок", 630, 670), // 10.30 11.10
new Period("4ая перемена", 670, 685), // 11.10 11.25
new Period("5ый урок", 685, 725), // 11.25 12.05
new Period("5ая перемена", 725, 745), // 12.05 12.25
new Period("6ой урок", 745, 785), // 12.25 13.05
new Period("6ая перемена", 785, 800), // 13.05 13.20
new Period("7ой урок", 800, 840), // 13.20 14.00
new Period("7ая перемена", 840, 850), // 14.00 14.10
new Period("8ой урок", 850, 890), // 14.10 14.50м
new Period("8ая перемена", 890, 900), // 14.50 15.00
new Period("9ый урок", 900, 940), // 15.00 15.40
new Period("9ая перемена", 940, 945), // 15.40 15.45
new Period("10ый урок", 945, 985), // 15.45 16.25
};
for (int i = 0; i < Periods.length; i++) {
if (Periods[i].getStart() <= getMinutes() && Periods[i].getEnd() > getMinutes())
return Periods[i];
}
return new Period("Свободное время", Periods[Periods.length - 1].getEnd(), Periods[0].getStart());
}
}
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#6600ff00"
android:gravity="center_horizontal"
android:textColor="#000"
android:textSize="18sp">
</TextView>
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:textColor="#000"
android:textSize="18sp"
android:layout_below="@+id/tv1" android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" android:background="#6600ff00">
</TextView>
</RelativeLayout>
Код: Выделить всё
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget"
android:minHeight="40dp"
android:minWidth="250dp"
android:updatePeriodMillis="0">
</appwidget-provider>Код: Выделить всё
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication4.app">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<receiver
android:name="MyWidget">
<intent-filter>
<action
android:name="android.appwidget.action.APPWIDGET_UPDATE">
</action>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_metadata"
android:widgetCategory="home_screen|keyguard"
android:resizeMode="horizontal|vertical">
</meta-data>
</receiver>
</application>
</manifest>
делал всё это по урокам 118-122, ещё есть просьба поподробнее в уроках описать intent, pendingintent, хотя, возможно, просто я не могу понять.
код в моём приложении частично скопирован с http://startandroid.ru/ru/uroki/vse-uro ... lenie.html
это я уже отчаялся и начал копировать