2012-08-15 43 views
11

Tôi muốn tạo một ứng dụng Android với chức năng giám sát thời gian thực. Một chức năng giám sát là kiểm tra dòng âm thanh. Các chức năng khác là tương tác với một cảm biến ngoại vi. Các chức năng giám sát này có thể được kích hoạt bởi những chức năng khác. Bên cạnh đó, để tiết kiệm điện năng tiêu thụ, chức năng âm thanh sẽ chạy ở chế độ hỏi vòng, ví dụ: ngủ trong một khoảng thời gian nhất định và đánh thức trong một khoảng thời gian nhất định.ứng dụng theo dõi android

Tôi đang xem xét cách thiết kế ứng dụng Android.

  • Có thiết kế chức năng âm thanh làm Dịch vụ hoặc Hoạt động không? Vấn đề là nếu nó được thiết kế như một Hoạt động, chức năng âm thanh sẽ tắt nếu màn hình tắt sau một khoảng thời gian.

  • Cách thiết kế chức năng bỏ phiếu? Sử dụng một AlarmManager hoặc một thread bên trong với Timer?

Mục tiêu của tôi là tiết kiệm điện năng tiêu thụ nhiều nhất có thể. Cảm ơn.

+0

"Kiểm tra luồng âm thanh" là gì? – CommonsWare

+0

sử dụng AudioRecord để đọc luồng bộ đệm âm thanh và kiểm tra mức decibel và tạo nhật ký. Cảm ơn. – babysnow

Trả lời

1

Tôi khuyên bạn nên theo dõi

a) Sử dụng Dịch vụ. Hoạt động là thực thể sống ngắn (chỉ hoạt động khi màn hình hiển thị trên màn hình)

b) Làm cho nền trước dịch vụ (đọc: http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification). Điều này sẽ làm giảm khả năng hệ thống sẽ giết dịch vụ của bạn

c) Trong dịch vụ, bắt đầu một chuỗi và thực hiện mọi thứ bạn cần trong chuỗi.

d) Nếu bạn muốn thực thi định kỳ, chỉ cần làm Thread.sleep() trong chuỗi (khi Thread ngủ nó không tiêu thụ chu trình CPU).

Tôi tin rằng c) và d) thích hợp hơn với AlarmManager. Đây là phần từ tài liệu (http://developer.android.com/reference/android/app/AlarmManager.html): "Lưu ý: Trình quản lý báo thức dành cho các trường hợp bạn muốn chạy mã ứng dụng ở một thời gian, ngay cả khi ứng dụng của bạn hiện không chạy. Đối với các hoạt động định thời bình thường (tick, timeouts, vv) thì việc sử dụng Handler dễ dàng và hiệu quả hơn nhiều. "

Vì ứng dụng của bạn chạy tốt hơn nên có một số chuỗi chạy vĩnh viễn và thực thi một số thứ trên đó. Nói chung Handler, HandlerThread, MessageQueue chỉ là các lớp tiện lợi để xử lý và lập lịch trình phức tạp hơn. Có vẻ như trường hợp của bạn khá đơn giản và bình thường nên là đủ.

1

concurring với Victor, bạn chắc chắn muốn sử dụng một dịch vụ, và ghim nó vào bộ nhớ bằng cách gọi startForeground()

Tuy nhiên tôi đề nghị bạn nhìn vào sử dụng được xây dựng trong hệ thống Handler; đặt chức năng của bạn vào một số Runnable và gọi mhandler.postDelayed(myRunnable, <some point in future>); điều này sẽ cho phép khung làm việc android tận dụng tối đa khả năng quản lý năng lượng.

0

Đó là dịch vụ.

Và bạn có thể muốn tăng thêm sức mạnh: dịch vụ có thể bị hủy và NOT khởi động lại sau, thậm chí là dịch vụ nền trước. Điều đó sẽ ngừng theo dõi của bạn.

Bắt đầu dịch vụ của bạn từ giao diện người dùng. Nếu bạn muốn dịch vụ này tiếp tục khởi động lại thiết bị, hãy khởi động nó từ BroadcastReceiver cho android.intent.action.BOOT_COMPLETED.

Tạo chuỗi trong dịch vụ như được mô tả trong các câu trả lời khác tại đây.

Ngoài ra, hãy sử dụng Trình quản lý báo thức để bắt đầu lại dịch vụ của bạn theo định kỳ. Nhiều startService() gọi là OK. Nếu đã chạy, dịch vụ sẽ tiếp tục chạy. Nhưng nếu nó bị hệ thống quên mất, nói rằng, sau một loạt các điều kiện tài nguyên thấp, nó sẽ được khởi động lại ngay bây giờ.

Lên lịch cho các báo thức đó một cách có trách nhiệm: để trở thành công dân tốt, hãy đặt tần suất tối thiểu hoàn toàn. Xét cho cùng, Android có một số lý do chính đáng để giết dịch vụ.

Với một số dịch vụ, thậm chí nhiều bước hơn có thể cần thiết, nhưng trong trường hợp này, phương pháp này dường như là đủ.

Các vấn đề liên quan