1

サービスが実行されていて、画面にアプリが表示されると、すべて正常に動作します。私のサービスはブロードキャスト メッセージを送信し、「MainActivity」でそれらを見ることができます。しかし、ホームボタンを押して、アプリがフォアグラウンドでなくなるとすぐに停止します。サービスはまだ実行されていますが、ブロードキャストが「停止中」または「一時停止中」のアプリに届きません。これは私のコードです:

主な活動:

onCreate:

    Intent intent = new Intent(getApplicationContext(), MainGate_Service.class);
    startService(intent);

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

    LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}

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

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
}


private BroadcastReceiver ServiceReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        String message = intent.getStringExtra("ServiceMessage");

        if(message != null) {
            if(alarmActive && message.equals("ring"))
                new soundPlayer().execute();
        }

        setNoti(message);

    }
}

サービス:

@Override
protected void onHandleIntent(Intent intent) {

    ring = rcv_ring();

    Intent ServiceIntent = new Intent("MainGate_ring");
    ServiceIntent.putExtra("ServiceMessage", ring);
    LocalBroadcastManager.getInstance(this).sendBroadcast(ServiceIntent);


}
4

5 に答える 5

1

ホームボタンを押すたびにonStopが呼び出され、受信者の登録が解除されるため、ブロードキャストを受信できるブロードキャストレシーバーはありません。

LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);

上記の行を onStop() から削除するか、サービスが停止するたびに登録解除してください。

于 2016-11-04T07:55:03.547 に答える
0
onStop#LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);

literally受信者の登録を解除します。そのため、サービスからブロードキャストされたメッセージを受信する受信機はありません。

于 2016-11-04T06:24:48.230 に答える
0

問題はここにあります

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

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
}

Activity.onStart() :

onCreate(Bundle) の後、またはアクティビティが停止したときに onRestart() の後に呼び出されますが、現在は再びユーザーに表示されています。その後に onResume() が続きます。

Activity.onStop()

ユーザーから見えなくなったときに呼び出されます。その後のユーザー アクティビティに応じて、次に onRestart()、onDestroy() を受け取るか、何も受け取りません。


そのため、アクティビティを離れるとすぐにonStop()呼び出され、レシーバーの登録を解除します。

登録解除コードをonDestroy()どちらにも入れないでください。呼び出される場合とされない場合があり、呼び出さActivityれずに が強制終了される可能性があるためです。

@Naveen Dissanayake が示唆しているように、ロジックを再考することをお勧めします。

于 2016-11-04T06:29:39.400 に答える
0

アクティビティ内に BroadcastReceiver を登録するため、アクティビティのライフサイクルに依存します。戻るボタンを押すと、アクティビティは「停止」状態になり、メソッド onPause および onStop が呼び出されます。Android は、リソースが不足しているため、このアクティビティを破棄することもできます。一方、サービスは、UI の準備ができていない場合でも、無期限に実行されていることを意味します。Activity からの通知を受け取りたい場合は、次の 2 つの解決策が考えられます。サービスが何らかのアクションについて通知するときにサウンドを再生したいようです。通知の onCreate で BroadcastReceiver を登録し、onDestroy で登録解除します。- 別の解決策 - アクションまたは IntentService をトリガーする場合は、別のサービスを使用します。そのブロードキャストに反応します。解決策を検討します-ResponseServiceを作成し、MainGate_Service(アプリケーションから)とともに開始し、アプリケーションからも停止します。その Service で BroadcastReceiver を登録するか、アプリが実行されていないときでも開始する場合は IntentFilter をマニフェストに追加します。アクティビティで、そのサービスにバインドします。Serive は、何らかの UI がアタッチされているかどうか (アクティビティがバインドされている場合) を認識し、アタッチされている場合はアクティビティに通知します。そうでない場合 - 他のことを行います (おそらく、通知を表示します) そのサービスにバインドします。Serive は、何らかの UI がアタッチされているかどうか (アクティビティがバインドされている場合) を認識し、アタッチされている場合はアクティビティに通知します。そうでない場合 - 他のことを行います (おそらく、通知を表示します) そのサービスにバインドします。Serive は、何らかの UI がアタッチされているかどうか (アクティビティがバインドされている場合) を認識し、アタッチされている場合はアクティビティに通知します。そうでない場合 - 他のことを行います (おそらく、通知を表示します)

于 2016-11-04T06:42:29.273 に答える