1

私は Android アプリの設計に取り組んでおり、一般的なパターンと思われるものを実装する方法に関する情報を探していますが、オンラインで情報を見つけることができないようです。

複数のアクティビティを含むアプリケーションを作成します。これらのアクティビティはすべて、ネットワークを介して WiFi デバイスと通信します。したがって、すべてのアクティビティがこの中央の「ネットワーク コミュニケーター」にアクセスする必要があるため、すべてのネットワーク通信コードを保持するサービスを作成する必要があると最初に考えました。すごい!

しかし今、私はバッテリー寿命を節約し、一般的にアプリケーションの邪魔にならないようにしたいと考えています. アプリからのアクティビティがまったく表示されない場合は、ネットワーク コードを実行する必要はなく、ソケットをシャットダウンして待機できます。その後、いずれかのアクティビティが再び表示されるようになったら、その時点で再接続できます。

ここに問題があります。これを行う方法がわかりません。アプリのすべてのアクティビティがいつ非表示になるかを判断するために使用される既存の方法またはパターンはありますか? アクティビティの 1 つが再開または作成されるたびに切断/再接続したくありません。これは、ほとんどの場合、ユーザーがアプリ内を移動してアクティビティを切り替えるためです。この間ずっとネットワーク接続を開いておきたい。

アクティビティがいつ表示され、いつ消えるかを追跡するために、ある種の「参照カウント」メカニズムをサービスに配置できますが、それはやり過ぎのようです。これに対する既存のメカニズムがないことに驚いています。

簡単なものが欠けていたらすみません...

4

3 に答える 3

0

Bound Serviceまさにあなたが必要としているもののように聞こえます: http://developer.android.com/guide/components/bound-services.html#Binder

この同じサービスを使用する複数のアクティビティがあるため、サービスを使用する必要がなくなったときにBindそれぞれのアクティビティをサービスに追加できます。Unbindこれを行うのに最適な場所はonStart()onStop() Activityライフサイクルメソッドです。これの素晴らしい点は、 がそれに縛られていServiceないことを検出すると、自分自身を殺してしまうことです。Activity

さらに読む:ユーザーhackbodonStart()/onStop()による優れた説明が良いオプションである理由: https ://stackoverflow.com/a/2304794/1839500

于 2014-12-02T03:56:00.403 に答える
0

次を使用して確認できます。

public void onPause(){
    super.onPause();
        Context context = getApplicationContext();
                ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
                List<RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                if (!taskInfo.isEmpty()) {
                  ComponentName topActivity = taskInfo.get(0).topActivity; 
                  if (!topActivity.getPackageName().equals(context.getPackageName())) {
                   StopPlayer();
                    Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP. SERVICE STOP", Toast.LENGTH_SHORT).show();
                  }
                }
      }

上記のコードをすべてのクラスの Pause() に挿入します。またはボタンrecent applicationをクリックしてアプリを起動すると、トーストします。これで、このトーストの代わりに任意の設定を設定して、サービスを停止できます。各クラスの Resume() の設定を確認してください。好みに値がある場合は、サービスを開始できます。homeback

于 2013-11-07T04:36:46.247 に答える
0

パターンは、サービスを基本クラスのアクティビティにバインドし、そのバインドされたアクティビティから複数のクラスを継承することです。

于 2013-11-07T04:40:10.143 に答える