5

Android アプリ (API レベル 14 以上) では、さまざまなアクティビティ (ローカル バインディングを使用してその関数を呼び出す) によって使用されるサービスがあり、サービスはゲーム要素の位置 (座標) を 60 Hz で計算します。[アクティビティ内だけでなく、サービス内で計算を行う正当な理由があります]。これらの継続的な位置の更新は、サービス (ゲーム ロジック チェック用) およびプレイスクリーン アクティビティ (描画用) で必要です。

あなたへの私の質問は次のとおりです。このシナリオのサービスからアクティビティへの通信に選択するオプションは何ですか? サービスが新しい位置を計算した時点と、それが UI (アクティビティ) に知られている時点との間の遅延をミリ秒単位で最小限に抑えたいと考えています (せいぜい遅延はほとんどありません)。

すべて (アクティビティ、サービス) が 1 つのプロセスにあると想定できます。

私は、各アクティビティが再開するたびにサービスにその存在を通知し (そして onPause() でアクティビティがサービスに利用できないことを通知する)、サービスが新しい座標を計算するときに簡単にチェックできるようにするソリューションについて考えていました。アクティビティが表示されているかどうか。表示されている場合は、visibleActivity.someMethod() を直接呼び出します。.someMethod() が内部的に制御を UI スレッドに渡すことが理解されています。

これを提案するのは、Broadcasts を経由するとパフォーマンスが低下するはずだからです。

あなたの考えを聞かせてください!

4

2 に答える 2

3

アクティビティは、 AIDLで実装されたリスナーをサービスに登録する必要があり、サービスはそれらをRemoteCallbackListで維持する必要があります。

サービスには、onResume/onPause のアクティビティによって呼び出されるこのような 2 つのメソッドが必要です。

public void registerListener(IYourListenerInterface listener) {
     callbackList.register(listener);
}


public void unregisterListener(IYourListenerInterface listener) {
     callbackList.unregister(listener);
}

メッセージを送信する必要がある場合:

int numOfListeners = callbackList.beginBroadcast();

for (int i = 0; i < numOfListeners; i++) {
    try {
        callbackList.getBroadcastItem(i).whatever();
    } catch (RemoteException e) {
        //ignore, listener probably gone
    }
}
callbackList.finishBroadcast();
于 2012-12-11T10:21:49.477 に答える
1

LocalBroadcastManager、またはおそらくOttoを使用します。これらは、既に提示されたソリューション (バインディングとコールバック) よりも優れたコンポーネントの分離を提供します。アクティビティはユーザーのアクション (構成の変更、[戻る] ボタン) に基づいて変更される可能性があるため、これは重要です。

アクティビティ内だけでなく、サービス内で計算を行う正当な理由があります。

正直なところ、それらの理由が何であるかは想像できません。

于 2012-12-11T12:07:10.553 に答える