2

正しいアプローチを決定するために助けが必要です。アプリケーション全体が中断または終了/破棄されるたびに、内部データベースのバックアップを外部ストレージ内の場所に作成したいと考えています。このメソッドを、Application を拡張する Main という中央クラスから呼び出したいと考えています。その理由は、いくつかのアクティビティを使用する必要があり、必要な場合にのみバックアップ メソッドを呼び出したいためです (アプリケーション全体が別のアプリケーションによって破棄または中断された場合など)。onPause() メソッドのすべてのアクティビティで、このバックアップ メソッドを呼び出さないようにしています。

アプリケーションの onCreate() メソッドでサービスを開始し、サービスが破棄されたときにバックアップ メソッドを開始することを考えました。しかし、サービスの背後にあるロジックを理解している限り、これは割り込みの場合には役に立ちません。また、サービスが開始されていないようです。startService(new Intent(getApplicationContext(), BackupService.class));さらに、サービスの onDestroy() メソッドを使用するのは良いアプローチではないと思います。これは、私の意見では、サービス クラスが作成されたものではありません。

私の質問を要約すると、サービスを使用するよりも良い方法を知っていますか、そうでない場合は、アプリ全体(アクティビティだけでなく)の時点でのみバックアップを呼び出すことができるようにするためにサービスを使用する方法を知っていますか中断または破壊されます。

4

3 に答える 3

1

まず第一に、あなたのサービスが「開始していないように見える」場合、あなたはおそらく何か間違ったことをしているでしょう。

目標を達成するには、アプリケーション全体が中断または終了/破棄されるたびに、内部データベースを外部ストレージ内の場所にバックアップします。

ここでは一般的に3つのケースがあります。

アクティビティレイヤーで実行する場合:

  1. アプリケーションがいつクラッシュしたかを知るには、キャッチされなかった例外をキャッチするカスタムハンドラーを実装する必要があります。

  2. アクティビティが「中断」されたことを知るための唯一の方法は、onPauseで行うことです。

  3. アクティビティがいつ「終了」したかを知るための唯一の方法は、onDestroyでそれを行うことです。

これには、明確なナビゲーションが必要であり、「メインアクティビティ」でのみ実行する必要があります。他のすべてのアクティビティが開始されてそこに戻るか、フラグを使用して、一時停止が別のアクティビティに移動したことが原因かどうかを示します。

サービスレイヤーで実行する場合:(onDestroyで実行する方法では、実行を継続するためにサービススティッキーを開始する必要があるため、中断されたケースを検出できません)

コードの他の部分を複雑にするクラッシュ/割り込み/終了であるかどうかを知るために、各アクティビティonBindにフラグを設定する必要があります(バインドしてバインドを解除する必要があります)。

反復的なコードの実行を回避するには、ジェネリック基本クラスを作成し、そこから他のアクティビティを拡張する必要があります。

于 2012-10-11T17:43:34.060 に答える
1

私は自分のゲームの 1 つでバックグラウンド ミュージックを再生するためにこのアプローチを使用していますが、このシナリオでも機能すると思います。

ブール値フラグを使用して、アプリがアプリの別の部分を起動しているかどうかを示します。

boolean movingInApp = false;
....
movingInApp = true;
Intent intent...
.....
public void onPause() {
    if(!movingInApp) {
        //start service
    }
}

public void onResume() {
    movingInApp = false;
    //Stop service
}

movingInAppインテントなどを起動する前にtoの値を設定することでtrue、アプリがサービスを開始しないようにすることができます。メソッドの後半で再度 false に設定することを忘れないでくださいonResume()。システムがアプリをバックグラウンドに移行させる場合、これは false になり、サービスが開始されます。

于 2012-10-11T17:26:19.540 に答える
0

すべてのアクティビティでベース アクティビティを拡張して、Android アクティビティ クラスを拡張しない理由はありません。ベース アクティビティには onPause の backupDB メソッドがあるため、すべてのアクティビティの一時停止メソッドに配置する必要はありません。

于 2012-10-11T17:59:14.723 に答える