Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 371
Завершенные тесты: 2
#1

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

13.02.2015, 16:40. Просмотров 630. Ответов 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]
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2015, 16:40     Как сделать ежесекундное обновление виджета?
Посмотрите здесь:

Как при обновлении виджета получить настройки и применить их Android
Android Ошибка при создании виджета
Android Подскажите что я делаю не так. Разработка Виджета
Создание виджета Android
Android Открытие диалога при удалении виджета с рабочего стола
Связывание виджета на рабочем столе и CallLog Android
Android Создание виджета
Как выпускать обновление в play market? Android
Изменить картинку ImageButton виджета Android
Добавление виджета через кнопку Android
Не отображается часть виджета Android
Когда вызвать getWidth() у виджета? Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru