6

SDK を使用して SIP アプリケーションを作成しています。私のアプリケーションには多くのアクティビティがあるため、サービスの onCreate および onDestroy メソッドを使用して SDK を初期化およびシャットダウンし、(個々のアクティビティだけでなく) アプリケーションの実行中に実行できるようにします。

私が作業しているサンプル アプリケーションは、startService を呼び出して、サービスをリークするだけです。これはやりたくありませんが、代替手段があるかどうかはわかりません。

私がやりたいこと、Activity 基本クラスの OnCreate メソッドで Context.BIND_AUTO_CREATE を使用してサービスにバインドし、OnDestroy でバインドを解除することです。すべてのアクティビティはこれから拡張されるため、すべてのアクティビティでサービスを利用できるようになります。

しかし、構成を変更したり、アクティビティを切り替えたりするとどうなりますか? サービスは活動間の短い期間に積極的に殺されますか?それともそうでないという保証はありますか? 前者だと、ちょっとサービス利用に支障がでませんか?アプリケーションの存続期間中、何かを存続させるには、どのデザイン パターンを使用する必要がありますか?

4

2 に答える 2

3

私は間違った質問をしていることに気づきました。ユーザーがアプリケーションを終了すると、アプリケーションが破棄されると想定していますが、おそらくそうではなく、バックグラウンドで待機するだけで、サービスも同様です。再設計が必要だと思います。

さらに、本当にその道を進みたい場合 (今はしていません)、サービスをアプリケーションにバインドすることができます。それは、アプリケーションの存続期間中存在します (私が覚えているように、それは、ユーザーがそれを強制終了するか、Android がそれを回収します)。この場合、バインドはアプリケーションと共に破棄されるため、明示的に unbind を呼び出す必要はありません。

于 2012-04-16T14:12:00.057 に答える
2

アクティビティで、次を使用してサービスを開始し、サービスバインドします。これにより、構成が変更された場合でもサービスが存続します。startService()

onDestroy()アクティビティのサービスからバインドを解除します。サービスは、バインドされているだけでなく、開始したときにも実行されます。

ランチャー アクティビティで静的カウンター変数を保持します。で他のアクティビティを起動する場合は 1 増やし、 で 1onCreate()減らしonDestroy()ます。したがって、3 つのアクティビティが開かれており、残りの 2 つをバックスタックに保持していると仮定すると、静的カウンターは 3 になります。次に、onDestroy()それぞれのカウンタを減らしてゼロかどうかを確認し、サービスを停止します。

私の FirstActivity ( Launcher ) には、public static int counter = 0;

次に、各アクティビティで:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FirstActivity.counter++;
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (--FirstActivity.counter == 0) {
        stopService(new Intent(this, MyService.class));
    }
}
于 2012-04-16T06:13:48.623 に答える