Как сделать ежесекундное обновление виджета?

Интерфейс, диалоги, темы, стили, меню
Ответить
krock21
Сообщения: 2
Зарегистрирован: 13 фев 2015, 18:51

Как сделать ежесекундное обновление виджета?

Сообщение krock21 » 13 фев 2015, 18:55

Здравствуйте, делаю виджет на подобии часов, он должен каждую секунду менять значения в своих textview.

Я пересмотрел всё, и русскоязычные, и англоязычные гайды, пытался делать бесконечный цикл с задержкой в секунду, но виджет работал только на эмуляторе 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());
    }
}
layout/widget.xml

Код: Выделить всё

<?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>
xml/widget_metadata.xml

Код: Выделить всё

<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>
AndroidManifest.xml

Код: Выделить всё

<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
это я уже отчаялся и начал копировать

krock21
Сообщения: 2
Зарегистрирован: 13 фев 2015, 18:51

Re: Как сделать ежесекундное обновление виджета?

Сообщение krock21 » 14 фев 2015, 09:54

неужели никто не поможет?
сейчас настроил отладку в intellij с genymotion, всё прекрасно работает, как и задумнно, но на телефоне почему-то не работает, вообще ничего не показывается, а отладку там я сделать не могу

Аватара пользователя
Vedan06
Сообщения: 20
Зарегистрирован: 13 фев 2015, 14:55

Re: Как сделать ежесекундное обновление виджета?

Сообщение Vedan06 » 14 фев 2015, 11:53

Циклы тут не причем, возможно в устройстве дело. Какой телефон?
Покопайся в исходниках еще , например
https://code.google.com/p/currentwidget/source/checkout виджет вывод заряда аккума.
Если даже не углубляться, то связь с твоим видна- то же самое обновление данных на экране различие только по времени обновления

Ответить