Tôi đang chạy một dịch vụ trong nền mà đọc GPS/Vị trí mạng và cần phải làm như sau:Dịch vụ Android và nhiệm vụ lặp đi lặp lại chạy trong chủ đề
chạy ở chế độ nền mà không bị gián đoạn trên ứng dụng khởi động lại và giữ nó sống càng nhiều càng tốt mà không bị giết chết (Điều này được giải quyết với sự giúp đỡ của Merlin của bình luận dưới đây)
trên một vị trí mới nhận được, gọi một dịch vụ web và gửi vị trí đọc
có một repeti nhiệm vụ bổ sung chạy mỗi 60 giây và gửi lại vị trí cuối cùng đến dịch vụ web. Điều này sẽ giúp trong trường hợp người dùng ở trong cùng một vị trí.
Có một vài điều tôi đã xem xét và tôi không chắc liệu tôi có hiểu đúng hay không. Dịch vụ này chạy trong cùng một luồng với ứng dụng chính, vì vậy việc gửi vị trí đến máy chủ trên cùng một luồng vì chuỗi giao diện người dùng có thể kích hoạt giao diện người dùng bị đóng băng và điều này không tốt. Ngoài ra tôi không chắc chắn nếu người nghe GPS/Mạng có chủ đề riêng của họ hoặc sử dụng các chủ đề tương tự như các ứng dụng.
Đây là một mã số rút gọn của dịch vụ để làm cho mọi việc rõ ràng hơn:
public class GPSLoggerService extends Service {
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 50, locationListenerNetwork);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
updateLocation(lastLocation);
}, 60, 60, TimeUnit.SECONDS);
return START_STICKY;
}
LocationListener locationListenerGps = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
LocationListener locationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
private void updateLocation(Location readLocation) {
//web service call
String response = WebServiceCalls.updateLocation(readLocation);
//log data in a local Sqlite database
saveLocation(readLocation)
}
mối quan tâm chính của tôi là làm thế nào để xử lý các cuộc gọi updateLocation và có nó trong một thread riêng biệt từ các chủ đề ứng dụng chính. ScheduleTaskExecutor Tôi tin rằng đó không phải là cách để đi. Đôi khi, ngay cả sau khi tôi gọi stopService() dịch vụ vẫn còn sống, ngay cả khi tôi nói với TaskExecutor để shutDown. Tôi không thể tìm thấy lời giải thích khác cho dịch vụ không dừng lại. Vì vậy, để tóm tắt: Tôi cần phải gửi vị trí mỗi khi người nghe nhận được một vị trí mới và gửi lại nó mỗi 60 giây. Tôi cũng cần có khả năng dừng dịch vụ nhanh chóng với các chủ đề đang hoạt động bị hủy.
Bạn đề nghị tôi xử lý trường hợp của tôi như thế nào?
bạn cần để bắt đầu nó dính? – Merlin