Frage

Ich werde Widget erstellen, die ihren Inhalt jede Minute aktualisiert werden muss (es zeigt zeitbezogene Daten).

Es besteht jedoch keine Notwendigkeit zu aktualisieren Widget wenn es momentan nicht sichtbar ist, was bedeutet:

  • wird ausgeschaltet
  • eine andere App läuft
  • Widget auf einem anderen (unsichtbar) Startbildschirm auf platziert

Was ist der beste Weg, nur sichtbar Widget jede Minute aktualisiert werden - ohne Gerät aufwacht noch unnötige Berechnungen zu tun? Nach Widget vor der Aktualisierung sichtbar, kleine Verzögerung wird akzeptabel ist.

War es hilfreich?

Lösung

von der Aktualisierung zu halten, wenn der Bildschirm ausgeschaltet ist, verwenden Sie die Alarmmanager einen wiederkehrenden Alarm planen, die das Telefon nicht funktioniert aufzuwecken.

Die beiden anderen Aufzählungszeichen Sie in Ihrer Frage haben, sind nicht möglich. Es gibt keine Möglichkeit zu erkennen, ob das Widget auf einem Startbildschirm ist, das momentan nicht sichtbar ist, und es gibt keine Möglichkeit, zu bestimmen, ob eine Anwendung ausgeführt wird, dass der Home-Bildschirm versteckt. Ich habe ein Ticket eingereicht am http://b.android.com diese Funktionalität zu Android hinzugefügt werden anfordert. Wenn Sie wie die mit ihm fühlen, wird es helfen, es Priorität zu gewinnen: http://code.google.com/p/android/issues/detail?id=5529&q=reporter:mark.r.baird&colspec=ID%20Type % 20Status% 20Owner% 20Summary% 20Stars

Andere Tipps

  1. Sie können fragen Sie den Powermanager über isScreenOn ()
  2. Sie können für Intent ACTION_SCREEN_OFF / ACTION_SCREEN_ON registrieren und schalten Sie ein / aus entsprechend Timer.

Allthough die Antwort über den Alarmmanager über richtig ist es nicht ausreichend sein kann, da ich auch viele Telefone beobachtete Alarme liefern, auch wenn sie nicht vom Typ * _WAKEUP ist. Dies kann passieren, wenn es andere Anwendungen sind installiert, die das Gerät aufwachen. Und wenn es einmal wach ist, liefert er alle anstehenden Alarme.

Ich fand diese unter einem Projekt mit dem Namen 24clock in goole Code . Es versucht aktualisiert Nicht das Widget, während Benutzer von zu Hause weg ist:

    ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List<RunningTaskInfo> runningTasks = am.getRunningTasks(2);
    for (RunningTaskInfo t : runningTasks) {
        if (t != null && t.numRunning > 0) {
            ComponentName cn = t.baseActivity;
            if (cn == null) continue;

            String clz = cn.getClassName();
            String pkg = cn.getPackageName();

            // TODO make this configurable
            if (pkg != null && pkg.startsWith("com.android.launcher")) {
                return true;
            }

            return false;
        }
    }

Es könnte eine Antwort für Sie Anforderung # 2 sein. Auch wenn es nicht unter anderen 3rd Party Werfern arbeiten könnte.

== == aktualisieren

Ein paar Monate später, habe ich plötzlich eine Idee in meinem Kopf darüber, wie zu erkennen, ob zeigt Home-Bildschirm. Ich habe es in meinem Blog rel="nofollow, und ich lief Test auf meinem Wunsch und es funktioniert gut. Die Methode ist die Android für alle installierten Pakete abzufragen, die zu der „Launcher“ Fähigkeit enthalten, und dann zu prüfen, ob es auf der Oberseite ist Stapel läuft. Wenn jemand getestet haben, lassen Sie mich wissen, das Ergebnis als gut, da ich keinen Zugriff auf andere Android-Geräte haben.

Die akzeptierte Antwort von mbaird trifft den Nagel auf den Kopf. Die vorgeschlagene onVisivilityChange() Methode, sofern sie umgesetzt werden, sollten vor allem die Fälle abdecken.

In der Zwischenzeit ist dies immer noch ein echtes Problem für einige Arten von Widgets. jom die Möglichkeit eingeführt, Registrierung ACTION_SCREEN_OFF / ACTION_SCREEN_ON Absichten zu erhalten. Dies ist nützlich, weil auf einem Nicht-Wakeup wiederkehrend Alarm setzt nicht ausreichend ist, wie andere Dienste Ursache Wakeups machen. Es ist schwierig, weil solche Handlungen nicht zu über AndroidManifest.xml abonniert werden und ein AppWidgetProvider nicht zu nennen context.registerReceiver() gestattet. Zuhören für ACTION_SCREEN_OFF Diese Themen werden in mehreren anderen Fragen Stackoverflow einschließlich diskutiert, android.intent.action.SCREEN_ON doesn ‚t arbeiten als Empfänger Intent-Filter und Android -?., wie Broadcast Absichten ACTION_SCREEN_ON / OFF erhalten

Ich habe es gelungen zu ACTION_SCREEN_OFF / ACTION_SCREEN_ON Absichten in einem Widget in Ihrer Anmeldung durch eine Tochtergesellschaft BroascastReceiver Instanz Erstellen und Verwenden von context.getApplicationContext().registerReceiver() es zu registrieren. Dies könnte gut sein, Betrug und zumindest in einer späteren Android Veröffentlichung kann in der Registrierungsphase scheitern oder vielleicht werden die Ereignisse einfach nicht zugestellt werden. Ich habe codiert diese Fälle zu behandeln, aber jetzt funktioniert es. Leider natürlich, wird dies fehlschlagen, wenn und wenn die Anwendung jemals getötet wird.

Eine andere Möglichkeit ist es, eine isHomeScreenShowing() Art von Verfahren zu verwenden, wie beschrieben

scroll top