tur*_*boy 4 service gps android location intentservice
我有一个应用程序,我试图定期获取用户位置并发送到服务器.我有一个附加到AlarmManager每分钟执行的服务(用于测试).该服务正确找到用户位置并注销GPS协议.一旦有GPS锁定,我就取消位置请求并停止服务.当我要求更新位置时,我开始Handler执行20秒后执行,这Handler将删除位置更新并Service在没有锁定的情况下停止.这一切都有效.
下面是使用Service该类工作的代码.
public class TrackingService extends Service {
private static final String TAG = TrackingService.class.getSimpleName();
LocationManager mlocManager;
LocationListener mlocListener;
NfcScannerApplication nfcscannerapplication;
String carerID;
Handler endServiceHandler;
Runnable endServiceRunnable;
@Override
public void onCreate() {
super.onCreate();
nfcscannerapplication = (NfcScannerApplication) getApplication();
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
Log.e(TAG, "Service created and location manager and listener created");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "in onDestroy in LocationService class");
mlocManager.removeUpdates(mlocListener);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
Log.e(TAG, "requesting location updates");
enableMenuButtonsHandler();
endServiceHandler.postDelayed(endServiceRunnable,20 * 1000);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
Log.e(TAG, "in TrackingService onlocationChanged and about to send lon/lat " + loc.getLongitude() + " " + loc.getLatitude());
DateTime dt = new DateTime();
DateTimeFormatter df3 = DateTimeFormat.forPattern("yyyy-MM-dd H:mm:ss.SSS");
String formattedNowTime3 = df3.print(dt);
Log.e(TAG, "Time of location fix in TrackingServive = " + formattedNowTime3);
Cursor c = nfcscannerapplication.loginValidate.queryAllFromCarer();
if (c.getCount() > 0) {
if(c.moveToLast()){
carerID = c.getString(c.getColumnIndex(LoginValidate.C_CARER_ID));
}
}
Log.e(TAG, "carer ID = " + carerID);
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService)");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService");
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}// end of MyLocationListener
public void enableMenuButtonsHandler() {
endServiceHandler = new Handler();
endServiceRunnable = new Runnable() {
public void run() {
endService();
}
private void endService() {
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService) from the endService handler");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService from the endService handler");
}
};
}
}// end of service
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,一旦我有GPS锁定,我想将长和lat发送到服务器.我知道我可以使用AsyncTask从Service,但我不想这样做.我更喜欢使用IntentService它在自己的后台线程中运行.这样我就可以直接从网络呼叫IntentService.
下面的代码实现了IntentService类,但它似乎没有锁定.GPS不断闪烁在手机上.日志记录语句到"请求位置更新",然后没有任何内容.
有没有人知道为什么没有锁定?提前致谢.
public class TrackingService extends IntentService {
private static final String TAG = TrackingService.class.getSimpleName();
LocationManager mlocManager;
LocationListener mlocListener;
NfcScannerApplication nfcscannerapplication;
String carerID;
Handler endServiceHandler;
Runnable endServiceRunnable;
public TrackingService() {
super("TrackingService");
}
@Override
protected void onHandleIntent(Intent intent) {
nfcscannerapplication = (NfcScannerApplication) getApplication();
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
Log.e(TAG, "Service created and location manager and listener created");
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
Log.e(TAG, "requesting location updates");
enableMenuButtonsHandler();
endServiceHandler.postDelayed(endServiceRunnable,20 * 1000);
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
Log.e(TAG, "in TrackingService onlocationChanged and about to send lon/lat " + loc.getLongitude() + " " + loc.getLatitude());
DateTime dt = new DateTime();
DateTimeFormatter df3 = DateTimeFormat.forPattern("yyyy-MM-dd H:mm:ss.SSS");
String formattedNowTime3 = df3.print(dt);
Log.e(TAG, "Time of location fix in TrackingServive = " + formattedNowTime3);
Cursor c = nfcscannerapplication.loginValidate.queryAllFromCarer();
if (c.getCount() > 0) {
if(c.moveToLast()){
carerID = c.getString(c.getColumnIndex(LoginValidate.C_CARER_ID));
}
}
Log.e(TAG, "carer ID = " + carerID);
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService)");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService");
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}// end of MyLocationListener
public void enableMenuButtonsHandler() {
endServiceHandler = new Handler();
endServiceRunnable = new Runnable() {
public void run() {
endService();
}
private void endService() {
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService) from the endService handler");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService from the endService handler");
}
};
}
}//end of trackingService
Run Code Online (Sandbox Code Playgroud)
[EDIT1]
public class TrackingService extends Service {
private static final String TAG = TrackingService.class.getSimpleName();
LocationManager mlocManager;
LocationListener mlocListener;
NfcScannerApplication nfcscannerapplication;
String carerID;
Handler endServiceHandler;
Runnable endServiceRunnable;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
nfcscannerapplication = (NfcScannerApplication) getApplication();
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
Log.e(TAG, "Service created and location manager and listener created");
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
Log.e(TAG, "requesting location updates");
enableMenuButtonsHandler();
endServiceHandler.postDelayed(endServiceRunnable, 20 * 1000);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "in onDestroy in LocationService class");
mlocManager.removeUpdates(mlocListener);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
Log.e(TAG, "in TrackingService onlocationChanged and about to send lon/lat " + loc.getLongitude() + " " + loc.getLatitude());
DateTime dt = new DateTime();
DateTimeFormatter df3 = DateTimeFormat.forPattern("yyyy-MM-dd H:mm:ss.SSS");
String formattedNowTime3 = df3.print(dt);
Log.e(TAG, "Time of location fix in TrackingServive = " + formattedNowTime3);
Cursor c = nfcscannerapplication.loginValidate.queryAllFromCarer();
if (c.getCount() > 0) {
if(c.moveToLast()){
carerID = c.getString(c.getColumnIndex(LoginValidate.C_CARER_ID));
}
}
Log.e(TAG, "carer ID = " + carerID);
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService)");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService");
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}// end of MyLocationListener
public void enableMenuButtonsHandler() {
endServiceHandler = new Handler();
endServiceRunnable = new Runnable() {
public void run() {
endService();
}
private void endService() {
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService) from the endService handler");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService from the endService handler");
}
};
}
}// end of service
Run Code Online (Sandbox Code Playgroud)
[EDIT2]
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
nfcscannerapplication = (NfcScannerApplication) getApplication();
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
Log.e(TAG, "Service created and location manager and listener created");
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Looper looper = handlerThread.getLooper();
Handler handler = new Handler(looper);
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener, looper);
Log.e(TAG, "requesting location updates");
enableMenuButtonsHandler();
endServiceHandler.postDelayed(endServiceRunnable, 20 * 1000);
return super.onStartCommand(intent, flags, startId);
}
Run Code Online (Sandbox Code Playgroud)
[EDIT3]
public class TrackingService extends Service {
private static final String TAG = TrackingService.class.getSimpleName();
LocationManager mlocManager;
LocationListener mlocListener;
NfcScannerApplication nfcscannerapplication;
String carerID;
Handler endServiceHandler;
Runnable endServiceRunnable;
HandlerThread handlerThread;
Looper looper;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
nfcscannerapplication = (NfcScannerApplication) getApplication();
mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
Log.e(TAG, "Service created and location manager and listener created");
Log.e(TAG, "creating handlerthread and looper");
handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
looper = handlerThread.getLooper();
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener, looper);
Log.e(TAG, "requesting location updates");
enableMenuButtonsHandler();
endServiceHandler.postDelayed(endServiceRunnable, 20 * 1000);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "in onDestroy in LocationService class");
mlocManager.removeUpdates(mlocListener);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
Log.e(TAG, "in TrackingService onlocationChanged and about to send lon/lat " + loc.getLongitude() + " " + loc.getLatitude());
DateTime dt = new DateTime();
DateTimeFormatter df3 = DateTimeFormat.forPattern("yyyy-MM-dd H:mm:ss.SSS");
String formattedNowTime3 = df3.print(dt);
Log.e(TAG, "Time of location fix in TrackingServive = " + formattedNowTime3);
Cursor c = nfcscannerapplication.loginValidate.queryAllFromCarer();
if (c.getCount() > 0) {
if(c.moveToLast()){
carerID = c.getString(c.getColumnIndex(LoginValidate.C_CARER_ID));
}
}
Log.e(TAG, "carer ID = " + carerID);
nfcscannerapplication.loginWebservice.sendCarerLocation(carerID, formattedNowTime3, String.valueOf(loc.getLatitude()), String.valueOf(loc.getLongitude()));
Log.e(TAG, "quiting handlerthread");
handlerThread.quit();
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService)");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService");
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}// end of MyLocationListener
public void enableMenuButtonsHandler() {
endServiceHandler = new Handler();
endServiceRunnable = new Runnable() {
public void run() {
endService();
}
private void endService() {
mlocManager.removeUpdates(mlocListener);
Log.e(TAG, "removed updates(TrackingService) from the endService handler");
TrackingService.this.stopSelf();
Log.e(TAG, "called stopSelf on TrackingService from the endService handler");
Log.e(TAG, "quiting handlerthread from the endService handler");
handlerThread.quit();
}
};
}
}// end of service
Run Code Online (Sandbox Code Playgroud)
Com*_*are 13
正如Pankaj Kumar所指出的那样,IntentService对于要完成的工作本质上是异步的情况,它不是一个合适的解决方案.一旦onHandleIntent()返回,您的服务就会被销毁.
使用常规Service,注册位置onStartCommand(),使用a HandlerThread来处理结果(这样你就可以将其Looper传入requestLocationUpdates()).收到您的位置或达到合适的超时后,请完成您的工作并致电stopSelf()该服务以将其关闭.