Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Krock21rus
74 / 74 / 27
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
1

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

13.02.2015, 16:40. Просмотров 785. Ответов 0
Метки нет (Все метки)

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

Я пересмотрел всё, и русскоязычные, и англоязычные гайды, пытался делать бесконечный цикл с задержкой в секунду, но виджет работал только на эмуляторе genymotion android 4.4.4(SGS5), в случае с бесконечным циклом начинал работать непонятно когда, а в последней версии работает вроде сразу, но на телефоне, сколько не жди, не выходит текст.
вот код моей последней попытки:
MyWidget.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<appwidget-provider
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/widget"
        android:minHeight="40dp"
        android:minWidth="250dp"
        android:updatePeriodMillis="0">
 
AndroidManifest.xml
[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>
аналогичное приложение(не виджет) я создал, с бесконечным циклом, и оно на телефоне прекрасно работает.
</appwidget-provider>[/XML]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2015, 16:40
Ответы с готовыми решениями:

Как при обновлении виджета получить настройки и применить их
Доброго времени. Создаю виджет, который отображает кол-во дней от некой...

Ежесекундное обновление числа в файле
Здравствуйте форумчане. Такой вопрос. как реализовать следующее. Допустим...

Постоянный вывод и ежесекундное обновление текущей даты и времени
как осуществить? procedure TForm2.FormActivate(Sender: TObject); begin...

Как навести мышку на x,y внутри виджета относительно 0,0 виджета (левого верхнего угла виджета)?
Как навести мышку на x,y внутри виджета относительно 0,0 этого виджета (левого...

Создать ежесекундное обновление функции ТДАТА, при этом нормально работать в Excel
возможно ли создать ежесекундное оновление функции ТДАТА() и при етом нормально...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2015, 16:40

Как добраться до виджета, который находится внутри другого виджета?
Есть QStackWidget, внутри которого на одной из страниц-виджетов находится...

Обновление данных виджета
Подскажите, как быстро сделать обновление информации в виджете. С помощью...

Как в yii сделать $this->controller->render('application.') из виджета?
Добрый день. Виджеты лежат в папке extensions (protected/extentions/widgets)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru