2013-02-24 48 views
6

Tôi có một dịch vụ âm nhạc đảm nhiệm phát lại nhạc trong nền khóa học và cũng có một vài điều khác như thông báo các hoạt động thay đổi giao diện người dùng cần thực hiện, lưu trữ và khôi phục hàng đợi, lấy bản ghi bài hát thông qua một con trỏ, và mỗi khi bài hát thay đổi nó sẽ chăm sóc cập nhật bitmap trên thông báo đang diễn ra.Tai nạn dịch vụ gỡ lỗi

Sự cố là gì? Dịch vụ gặp sự cố hầu như mọi lúc người dùng cố gắng .. vẫn còn khá nhiều thứ khác. Ví dụ, chơi một bài hát, và sau đó mở một trò chơi treo dịch vụ, đôi khi những thứ ánh sáng như duyệt web trên chrome cũng sẽ sụp đổ.

Một vài chi tiết:

1 - Dịch vụ này được bắt đầu qua startService(new Intent(this, MyMusicService.class)); nhưng khi người dùng rời khỏi hoạt động tôi gọi startForeground(mId, mNotification); để hiển thị một thông báo liên tục cung cấp các điều khiển dễ dàng, và cũng vì startForeground() là intented cho các dịch vụ đó nên được ưu tiên như việc giết hại những bởi activityManager sẽ gây rối cho kinh nghiệm người dùng (âm nhạc dừng lại nếu dịch vụ này được giết)

2 - tôi đã cố gắng để tái tạo vụ tai nạn, và chắc chắn nó sẽ xảy ra khi thực hiện không quá công việc nặng nhọc, giống như duyệt trên chrome (điều này sẽ tái tạo gần 50% thời gian), và luôn luôn khi thực hiện những việc như khởi chạy đền 2. FYI, nếu không làm gì cả - chỉ phát nhạc trên nền và nhàn rỗi, phát lại sẽ không phải là dừng lại ở tất cả, và nó hoạt động theo cách nó dự định.

3 - Điện thoại tôi đang sử dụng làm thiết bị kiểm tra không phải là thiết bị nhớ chậm hoặc thấp, đó là Galaxy Nexus.

4 - tôi đã cố gắng bắt một vài chờ đợi và đôi khi nó chỉ đơn giản nói:

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

mà không cần bất kỳ tin nhắn khác, và đôi khi cùng một thông điệp được đi kèm với một 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} 

Điều tôi cũng nhận thấy là hầu như luôn luôn khi xảy ra sự cố, rất nhiều dịch vụ khác "die". Tôi đang đính kèm nhật ký đầy đủ here.

5 - tôi đã cố gắng sử dụng ACRA để có được thêm thông tin về vụ tai nạn nhưng mặc dù tất cả mọi thứ dường như được thiết lập một cách chính xác, sau khi đâm nhật ký không được gửi đi, hoặc chỉ có gì xảy ra. Tôi biết ACRA phát hiện vụ tai nạn và bắt đầu:

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). 

nhưng không được gửi, không phải đến mailto tôi đặt, hoặc mẫu tại tài liệu của Google.

Bạn không chắc chắn nên thử gì khác và tôi đã hy vọng có được một số ý tưởng hay về những gì cần tìm. Như tôi đã nói, dịch vụ này thực hiện một vài điều, mà kiến ​​thức của tôi không phải là tài nguyên mở rộng, và thành thật mà nói, tôi thậm chí không chắc chắn nếu nó là bất cứ điều gì để làm với các dịch vụ đó là crashing.

Dưới đây là một số gist của một số bit mã diễn ra trong dịch vụ và mã ACRA tôi đã thiết lập. Nó cũng đáng chú ý là tôi đã cố gắng để tái sản xuất các dịch vụ bị rơi với người chơi âm nhạc khác và tôi đã không chạy vào vấn đề ở tất cả.

Cảm ơn sự giúp đỡ!

Trả lời

3

Có vẻ như hệ điều hành cho rằng dịch vụ của bạn ở chế độ nền ngay sau khi người dùng rời khỏi hoạt động của bạn, mặc dù đó là dịch vụ 'tiền cảnh'.

tôi sẽ thiết kế dịch vụ MyMusicService của bạn một chút khác nhau mặc dù:

  1. Trong onCreate chuẩn bị MediaPlayer.
  2. Trong việc triển khai onStart hoặc onStartCommand dịch vụ của bạn, hãy bắt đầu phát tệp âm thanh được chọn/thích hợp. Có được một wake_lock một phần nếu bạn muốn âm nhạc tiếp tục phát trong nền, ngay cả khi thiết bị đang ngủ. Trả lại START_STICKY.
  3. Thêm thông báo vào thanh trạng thái. 3 Trong onDestroy, hãy dọn sạch mọi thứ.

Khi nhạc dừng, bằng tương tác của người dùng hoặc khi bài hát kết thúc, hãy đảm bảo xóa thông báo và nhả khóa thức.

Bạn có thể tìm thấy hướng dẫn hay tại đây. http://www.youtube.com/watch?v=mcb99u8Nlgs&list=PL14AA2548E3C96B50

Cập nhật sau OP thêm ý kiến ​​/ cập nhật 'ý chính':

tôi thấy rằng onReceive của bạn BroadcastReceivermReceiver trong dịch vụ của bạn truy cập một cơ sở dữ liệu. Đây có thể là vấn đề. Tắt tải này lên IntentService: Trong onReceive, chỉ cần bắt đầu một IntentService sử dụng cùng một Intent mà đã nhận được onReceive. Sau đó, IntentService có thể thực hiện tất cả công việc thực tế và không phải lo lắng về bất kỳ khả năng truy cập cơ sở dữ liệu chậm nào có thể gây ra quá trình giết chóc.

Nếu phát nhạc vẫn cần phải hoạt động khi thiết bị đang ngủ, hãy nhớ lấy khóa đánh thức một phần (và đảm bảo nhả phím khi cần thiết!).

+0

Tôi thực sự đang trở START_STICKY trong onStartCommand rồi. Theo như onCreate, tôi bắt đầu chơi, nhưng tôi không thể gọi chuẩn bị kể từ khi dịch vụ được bắt đầu ngay cả trước khi âm nhạc được yêu cầu để chơi và do đó tôi không biết con đường mà bài hát tôi nên vượt qua. Ngoài ra, tôi cũng thêm thông báo trên thanh trạng thái khi một bài hát đang phát, tôi không chắc liệu bạn có đạt được điểm cao nhất trong bài viết mà tôi đã đăng hay không. Tuy nhiên tôi sẽ xem xét mua một wakelock mà tôi không nghĩ rằng tôi cần thiết vì nó đã chơi nhạc trong bg cho như 30 phút thời gian trong khi tôi đã không sử dụng điện thoại. –

+0

Trong liên kết 'gist', tôi không thấy bất kỳ triển khai 'onStart' hoặc 'onStartCommand' nào, tại sao tôi hỏi :) Nếu bạn đang gọi 'startForeground' trong onCreate của dịch vụ, khóa đánh thức một phần chỉ hữu ích khi bạn muốn chơi ngay cả khi thiết bị đang ngủ. 'StartForeground' nên đã ngăn chặn việc giết chết dịch vụ khi thiết bị không ngủ. Bạn đã kiểm tra việc triển khai phương thức onReceive của mình trong bộ thu phát sóng của Dịch vụ chưa? Chúng phải chạy nhanh; nếu không, quá trình của bạn có thể bị giết. –

+0

Xin chào, bạn nói đúng, tôi không bao gồm onStartCommand, tôi đã thêm ngay bây giờ khi tôi cập nhật ý chính. Ngoài ra, tôi gọi startForeground chỉ khi rời khỏi hoạt động (tức là khi về nhà, hoặc một hoạt động khác) và gọi stopForeground (true) khi tiếp tục. Theo như onReceive, không chắc chắn làm thế nào tôi có thể kiểm tra để xem nếu nó chạy một cách nhanh chóng hay không. Tôi đã thêm một vài bit của onReceive vào gist –

0

Nó chắc chắn sẽ giúp ích nếu bạn cung cấp thêm thông tin về kiến ​​trúc của mình, đặc biệt cách hoạt động của bạn và Dịch vụ của bạn tương tác.

Dự đoán tự nhiên, nhưng với tôi, có vẻ như Dịch vụ của bạn có tham chiếu đến Hoạt động của bạn. Hoạt động của bạn có khả năng bị tiêu diệt ngay sau khi bạn sử dụng một ứng dụng khác.

Một vài câu hỏi.

  • Dịch vụ của bạn và Hoạt động của bạn có chạy trong cùng một quy trình không? (Điều này ảnh hưởng đến cách thông tin giữa Hoạt động và Dịch vụ có thể được chia sẻ.)
  • Lớp Hoạt động của bạn có bất kỳ biến nào mà Dịch vụ cố gắng truy cập không? (Chúng thuộc về lớp Ứng dụng, nếu có.)
+0

Có, cả hai đều chạy trên cùng một quy trình. Tôi đã cố gắng thực hiện các quy trình khác nhau, nhưng giao diện aidl chỉ làm tôi phát điên. Theo như truy cập, họ chủ yếu giao tiếp thông qua ý định, ví dụ người dùng nhấp vào nút phát trên hoạt động, sau đó phát sóng sẽ được gửi, dịch vụ sẽ phát và phát bài hát được chỉ định trên phần bổ sung của chương trình phát sóng. Để trả lời câu hỏi đầu tiên của bạn, không, dịch vụ không giữ tham chiếu đến hoạt động. –

2

Tôi có cùng vấn đề này, bạn có thể kiểm tra xem mId của bạn có giống với id của thông báo không?Ngoài ra kiểm tra nó khác với 0, vì nó sẽ kết hợp nó với id của hoạt động và chết với hoạt động.

Chỉnh sửa: Đồng thời kiểm tra mã của bạn không sử dụng onHandle nhưng onStartCommand.

0

Vui lòng kiểm tra mã của bạn, có lẽ đâu đó bạn phá hủy quá trình của bạn mình, như System.exit(0);, nếu bạn làm điều đó, sau đó sẽ có các bản ghi

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! 
Các vấn đề liên quan