6

もちろん、バックグラウンドでの音楽再生を処理する音楽サービスがあります。また、実行する必要がある UI 変更のアクティビティの通知、キューの保存と復元、カーソルを介した曲レコードの取得、およびすべての曲が変更されると、進行中の通知でビットマップが更新されます。

何が問題ですか?ユーザーが何をしようとしても、サービスはほぼ常にクラッシュします。たとえば、曲を再生してからゲームを開くと、サービスがクラッシュします。Chrome で Web を閲覧するなどの軽い操作でもサービスがクラッシュすることがあります。

いくつかの詳細:

1 -サービスは経由で開始されstartService(new Intent(this, MyMusicService.class)); ますが、ユーザーがアクティビティを離れるとstartForeground(mId, mNotification);、簡単な制御を提供する進行中の通知を表示するために呼び出します。また、startForeground()ActivityManager によるこれらの強制終了はユーザー エクスペリエンスを混乱させるため、優先する必要があるサービスを対象としているためです。 (サービスが強制終了された場合、音楽は停止します)

2 -クラッシュの再現を試みましたが、Chrome でのブラウジングのような重い作業をしていないとき (ほぼ 50% の確率でクラッシュが再現されます)、およびTemple Run 2 の起動などを行っているときに必ず発生します。参考までに、何もしなくても、バックグラウンドでアイドル状態で音楽を再生するだけで、再生はまったく停止せず、意図したとおりに機能します。

3 -私がテスト デバイスとして使用している電話は、決して低速または低メモリ デバイスではなく、Galaxy Nexus です。

4 -いくつかの long をキャッチしようとしましたが、単に次のように表示されることがあります。

02-24 06:53:32.586: I/ActivityManager(387): Process com.deadpixels.light.player (pid 27720) has died.

他のメッセージが表示されず、同じメッセージに WINDEATH が付随する場合があります。

 02-24 06:53:32.586: W/ActivityManager(387): Scheduling restart of crashed service com.deadpixels.light.player/.service.MyMusicService in 5000ms
 02-24 06:53:32.602: W/InputDispatcher(387): channel '418d09c8    com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
 02-24 06:53:32.602: E/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
 02-24 06:53:32.602: W/InputDispatcher(387): Attempted to unregister already unregistered input channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)'
 02-24 06:53:32.602: I/WindowState(387): WIN DEATH: Window{418d09c8 u0 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity}

また、ほとんどの場合、クラッシュが発生すると、他の多くのサービスが「停止」することに気付きました。完全なログをここに添付します。

5 - ACRAを使用してクラッシュに関する詳細情報を取得しようとしましたが、すべてが正しくセットアップされているように見えますが、クラッシュ後にログが送信されないか、何も起こりません。ACRA がクラッシュを検出して起動することはわかっています。

02-24 06:53:37.719: D/ACRA(28293): ACRA is enabled for com.deadpixels.light.player, intializing...
02-24 06:53:37.742: D/ACRA(28293): Using default Mail Report Fields
02-24 06:53:37.742: D/ACRA(28293): Looking for error files in /data/data/com.deadpixels.light.player/files
02-24 06:53:37.742: W/ACRA(28293): com.deadpixels.light.player reports will be sent by email (if accepted by user).

しかし、設定したmailtoにもGoogleドキュメントのフォームにも何も送信されていません。

他に何を試すべきかわからないので、何を探すべきかについて良いアイデアを得たいと思っていました. 私が言ったように、サービスはいくつかのことを行いますが、私の知る限り、それほどリソースを消費するものではありません。正直なところ、クラッシュしているサービスと関係があるかどうかさえわかりません。

サービスで発生するいくつかのコード ビットの要点と、私がセットアップした ACRA コードを次に示します。また、他の音楽プレーヤーでサービスのクラッシュを再現しようとしたことも注目に値しますが、問題はまったく発生しませんでした.

助けてくれてありがとう!

4

4 に答える 4

3

「フォアグラウンド」サービスであるにもかかわらず、ユーザーがアクティビティを離れるとすぐに、OSはサービスがバックグラウンドにあると見なしているようです。

ただし、サービスの設計MyMusicServiceは少し異なります。

  1. onCreateを準備しMediaPlayerます。
  2. onStartまたはサービスのonStartCommand実装で、選択した/適切なサウンドファイルの再生を開始します。デバイスがスリープ状態の場合でも音楽をバックグラウンドで再生し続ける場合は、部分的なwake_lockを取得します。戻りSTART_STICKYます。
  3. ステータスバーに通知を追加します。3onDestroyで、すべてをクリーンアップします。

ユーザー操作または曲の終了時に音楽が停止した場合は、必ず通知を削除してウェイクロックを解除してください。

素晴らしいチュートリアルがここにあります。 http://www.youtube.com/watch?v=mcb99u8Nlgs&list=PL14AA2548E3C96B50

OPがコメントを追加した後の更新/'要点'の更新:

あなたonReceiveBroadcastReceiver mReceiverサービスのがデータベースにアクセスしているようです。これが問題になる可能性があります。IntentServiceこれを:にオフロードします。で、受け取ったものと同じものを使用してonReceive開始します。そうすれば、は実際のすべての作業を実行でき、プロセスの強制終了を引き起こす可能性のある低速のデータベースアクセスについて心配する必要はありません。IntentServiceIntentonReceiveIntentService

デバイスがスリープ状態のときに音楽の再生が引き続き機能する必要がある場合は、必ず部分的なウェイクロックを取得してください(必要に応じて必ず解除してください)。

于 2013-02-26T22:58:00.020 に答える
2

これと同じ問題がありました。mId が通知の ID と同じかどうかを確認できますか? また、それが 0 ではないことも確認してください。これは、それをアクティビティの ID に関連付け、アクティビティで終了するためです。

編集: また、コードが onHandle ではなく onStartCommand を使用していないことを確認してください。

于 2013-03-04T12:43:32.403 に答える
0

コードを確認してください。おそらくどこかでプロセスを自分で破棄してください。System.exit(0);そうすると、ログが表示されます

channel '418d09c8    

com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity(server)'
 ~ Consumer closed input channel or an error occurred.  events=0x902-24 06:53:32.602:
 E/InputDispatcher(387): channel '418d09c8 
 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)'
  ~ Channel is unrecoverably broken and will be disposed!
于 2014-04-01T01:06:58.753 に答える
0

アーキテクチャ、特にアクティビティとサービスがどのように相互作用するかについて、より多くの情報を提供していただければ、確かに役に立ちます。

もちろん大雑把な推測ですが、Service が Activity への参照を持っているように思えます。別のアプリを使用するとすぐにアクティビティが破棄される可能性があります。

いくつかの質問。

  • サービスとアクティビティは同じプロセスで実行されますか? (これは、Activity と Service の間で情報を共有する方法に影響します。)
  • Activity クラスには、Service がアクセスしようとする変数がありますか? (もしあったとしても、それらは Application クラスに属します。)
于 2013-03-04T08:48:12.750 に答える