2

私のアプリケーションには、同じプロセスで実行されているアクティビティとサービスがあります。ユーザーが [STOP] ボタンをクリックしてアクティビティを終了すると、そのアクティビティによってサービスが終了します。

Androidのドキュメントから、システムがプロセスを強制終了してリソースを再利用できることを理解しています:

「アクティビティが停止すると、システム メモリを回復する必要がある場合、システムはインスタンスを破棄する可能性があります。極端な場合、システムはアクティビティの最後の onDestroy() コールバックを呼び出さずにアプリ プロセスを単純に強制終了する可能性があります。」

質問 1: サービスではなく、アクティビティが強制終了される可能性はありますか? 私は自分のサービスが存続することを望みます。

答えが「はい」の場合

質問 2: アクティビティが強制終了されたことをサービスに通知できるメカニズムはありますか?

IBinder.linkToDeathには必要な機能がありますが、アクティビティではなくプロセスに適用されるようです。

アクティビティがセマフォの所有権を取得し、サービスがスレッドを使用してそれを待機するような間接的な方法を考えました。次に、アクティビティが強制終了されると、セマフォが解放され、サービスがセマフォを取得して通知を提供します。しかし、私が使用できるAndroid中心の手法がないかどうか疑問に思っていました.

【編集開始】

あなたが提供してくれた非常に有益なコメントを読んだ後、私が提示しているシナリオを明確にしたいと思います.

アクティビティとサービスの 2 つのコンポーネントを開始しました。アプリケーションは、アクティビティが停止して破棄された後もサービスを実行し続けることができるように構成されています。ユーザーはアクティビティを複数回再開/開始でき、サービスの同じインスタンスを使用します。

通常、アクティビティは onDestroy() 中に破棄されたことをサービスに通知します。ただし、 onDestroy() は呼び出されない場合があります。

onDestroy() メソッドを呼び出さずにアクティビティが強制終了されたことをサービスに通知するために使用できる Android 固有のメカニズムがあるかどうかを知りたいです。

[編集終了]

ご協力いただきありがとうございます。

意思

4

2 に答える 2

0

はい、サービスとアクティビティは互いに独立して実行できます。

あなたがやろうとしていることを達成するには、アクティビティの onStart() 関数 (または起動したい場所) で startService() を使用して明示的にサービスを開始し、同じ時点でそれにバインドします。明示的な startService なしでバインドすると、アクティビティを強制終了したときにサービスが停止します (他のアクティビティがまだバインドされていない場合)。

アクティビティの onStop() で、サービスの関数を呼び出して、アクティビティが強制終了されたことを伝えます。

アクティビティで:

private ServiceRecordJourney yourService;
private ServiceConnection serviceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {

        YourServiceBinder binder = (YourServiceBinder) service;
        yourService= binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
    }
};

@Override
public void onStart(){
    super.onStart();

    startService(new Intent(this, YourService.class));

    // Bind to Service
    Intent intent= new Intent(this, YourService.class);
    bindService(intent, serviceConnection , Context.BIND_AUTO_CREATE);
}

@Override
public void onStop(){
    super.onStop();

    if(yourService != null){
                yourService.activityKilledFunction();
        unbindService(serviceConnection);
    }
}

OS によって強制終了されるのをさらに防ぐには、サービスをフォアグラウンドにする (そして通知を表示する) 必要があります。また、明示的に開始されているため、サービスで明示的な停止を処理する必要があります (サービスで stopSelf() を呼び出すか、コンテキスト オブジェクトで stopService() を呼び出します)。

さまざまな意図を持つ複数の startService() 呼び出しを使用してサービスへの通信を処理できますが、私は上記のアプローチを好みます (この場合、バインディングが望ましいアプローチであると確信しています)。

また、サービスの実行中に、ユーザーがアクティビティを開始または停止するたびに、アクティビティはサービスにバインドおよびバインド解除されます。

于 2013-07-20T16:41:07.987 に答える