34

コンテンツを毎分更新する必要があるウィジェットを作成します (時間関連のデータを表示します)。

ただし、現在非表示の場合はウィジェットを更新する必要はありません。つまり、次のことを意味します。

  • 画面がオフになっている
  • 別のアプリが実行中です
  • ウィジェットは別の (非表示の) ホーム画面タブに配置されます

デバイスを起動したり、不要な計算を行ったりせずに、表示されているウィジェットのみを毎分更新する最良の方法は何ですか? ウィジェットが表示されてから、更新までのわずかなラグは許容されます。

4

4 に答える 4

20

画面がオフのときに更新されないようにするには、AlarmManagerを使用して、電話をウェイクアップしない定期的なアラームをスケジュールします。

あなたがあなたの質問に持っている他の2つの箇条書きは不可能です。ウィジェットが現在表示されていないホーム画面にあるかどうかを検出する方法はありません。また、ホーム画面を非表示にしているアプリが実行されているかどうかを判断する方法もありません。この機能をAndroidに追加するようリクエストするチケットをhttp://b.android.comに提出しました。主演したい場合は、優先順位を上げるのに役立ちます:http ://code.google.com/p/android/issues/detail?id=5529&q=reporter:mark.r.baird&colspec=ID%20Type%20Status% 20Owner%20Summary%20Stars

于 2010-03-10T14:09:18.093 に答える
12
  1. isScreenOn() について PowerManager に問い合わせることができます。
  2. Intent ACTION_SCREEN_OFF/ACTION_SCREEN_ON に登録し、それに応じてタイマーのオン/オフを切り替えることができます。

AlarmManager に関する上記の回答は正しいですが、多くの電話が *_WAKEUP タイプでなくてもアラームを配信していることを確認したため、十分ではない可能性があります。これは、デバイスを起動している他のアプリケーションがインストールされている場合に発生する可能性があります。そして、いったん起動すると、保留中のすべてのアラームを配信します。

于 2011-01-21T11:38:11.023 に答える
6

これは24clock in goole codeという名前のプロジェクトで見つけました。ユーザーが家にいない間はウィジェットを更新しないようにします。

    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;
        }
    }

要件 2 の答えになるかもしれません。ただし、他のサードパーティのランチャーでは機能しない場合があります。

==更新==

数か月後、突然、ホーム画面が表示されているかどうかを検出する方法について頭に浮かびました。私はそれを自分のブログに載せ、Desire でテストを実行しましたが、問題なく動作しました。この方法は、インストールされているすべてのパッケージについて Android にクエリを実行し、そのうちの 1 つに「ランチャー」機能が含まれているかどうかを確認し、それが実行中のスタックの最上位にあるかどうかを確認します。私は他の Android デバイスにアクセスできないので、誰かがテストした場合は結果も教えてください。

于 2010-05-30T01:16:52.203 に答える
1

mbard からの受け入れられた回答は、頭に釘を打ちます。提案されたonVisivilityChange()方法は、実装された場合、上記のすべてのケースをカバーする必要があります。

それまでの間、これは一部のタイプのウィジェットにとって依然として現実的な問題です。Jom は、ACTION_SCREEN_OFF/ACTION_SCREEN_ON インテントを受け取るために登録する可能性を導入しました。他のサービスが原因でウェイクアップが発生するため、非ウェイクアップの繰り返しアラームに依存するだけでは不十分なため、これは便利です。このようなアクションは AndroidManifest.xml を介してサブスクライブできず、AppWidgetProvider は を呼び出すことが許可されていないため、難しいですcontext.registerReceiver()これらの問題は、ACTION_SCREEN_OFF のリッスンandroid.intent.action.SCREEN_ON がレシーバー インテント フィルターとして機能しないAndroid - ブロードキャスト インテント ACTION_SCREEN_ON/OFF を受信する方法など、いくつかの他の StackOverflow の質問で説明されています。.

BroascastReceiver補助インスタンスを作成し、それを使用context.getApplicationContext().registerReceiver()して登録することにより、ウィジェットで ACTION_SCREEN_OFF/ACTION_SCREEN_ON インテントをサブスクライブすることに成功しました。これは不正行為である可能性が高く、少なくともその後の Android リリースでは、登録段階で失敗するか、単にイベントが配信されない可能性があります。これらのケースを処理するようにコーディングしましたが、今のところ機能します。残念ながら、もちろん、アプリケーションが強制終了された場合、これは失敗します。

別の可能性は、ここで説明されているように、xandyの回答で参照されているisHomeScreenShowing()一種の方法を使用することです。インストールされたアプリケーションの生成されたリストをキャッシュし、ACTION_PACKAGE_ADDED/CHANGED/REMOVED ブロードキャストをリッスンして更新することで、おそらく最適化できます。CATEGORY_HOME

私の戦略は次のとおりです。

  • 表示されていないときに (アラームの繰り返しによって) 呼び出されないようにしてください。
  • 呼び出されたら、高価なことを行う前に、画面の状態やその他の可視性インジケーターを確認してください。
  • その後、 を呼び出してIntentService、永続的なネットワーク接続を含む比較的高価な作業を処理します。これは、リモート サービスの状態をほぼリアルタイムで監視するために必要です。
于 2014-09-07T12:40:36.110 に答える