我有一个服务,它运行一种方法来获取用户的位置,然后使用 alarmManager 在给定的时间间隔内将其发送到服务器。它工作正常,但有时它运行两次,在我的数据库中看到双重输入,有时时间戳相差 1 秒,有时完全重复数据,在 LogCat 中。我已经搜索过它,但我没有找到与我的问题类似的东西。
这是我的服务的代码:
package com.mgtphil.mibackground;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import com.mgtphil.mibackground.MyLocation.*;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
// the service that runs in background
public class MIService2 extends Service{
private final Context context = this;
GPSTracker gps;
HttpPost httppost;
HttpResponse response;
HttpClient httpclient;
List<NameValuePair> nameValuePairs;
MyLocation myLocation = new MyLocation();
DatabaseHandler db = new DatabaseHandler(this);
UserDatabase udb = new UserDatabase(this);
static double latitude;
static double longitude;
String userid;
String timeType;
String lat;
String lon;
Date dt;
@Override
public void onCreate() {
Log.v("onCreate","MIService2 Service Created");
}
//MyLocation class
LocationResult locationResult = new LocationResult(){
@Override
public void gotLocation(Location location){
//Got the location!
Log.v("MI Service","MI Service gotLocation()");
latitude = location.getLatitude();
longitude = location.getLongitude();
if(!myLocation.gps_enabled && !myLocation.network_enabled){
Log.v("No Provider Enabled.", "No Provider Enabled. Do nothing.");
} else {
if(latitude == 0 && longitude == 0) {
//TODO
} else {
sendData();
}
}
}
};
//end
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Log.v("onStartCommand","MIService2 Service Started");
myLocation.getLocation(this, locationResult);
List<User> user = udb.getAllUser();
for(User ur : user) {
userid = ur.getUserID();
timeType = ur.getTimeType();
}
return START_STICKY;
} //end onstartcommand
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onDestroy() {
//Toast.makeText(this, "MI Service Stopped", Toast.LENGTH_LONG).show();
db.close();
udb.close();
Log.d("onDestroy","Service Stopped");
}
public void sendData() {
long dtMili = System.currentTimeMillis();
dt = new Date(dtMili);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected())
{
try {
//check db first, and send it's data first
sendSavedData();
lat = String.valueOf(latitude);
lon = String.valueOf(longitude);
//code to send data to server
//httpclient=new DefaultHttpClient();
httpclient = new MyHttpClient().getNewHttpClient();
httppost= new HttpPost(Config.serverAdd); // make sure the url is correct.
//add your data
nameValuePairs = new ArrayList<NameValuePair>(7);
// Always use the same variable name for posting i.e the android side variable name and php side variable name should be similar,
nameValuePairs.add(new BasicNameValuePair("cmd","tracking"));
nameValuePairs.add(new BasicNameValuePair("userid",userid)); // $userid = $_POST['userid'];
nameValuePairs.add(new BasicNameValuePair("operationType","track"));
nameValuePairs.add(new BasicNameValuePair("timeType",timeType));
nameValuePairs.add(new BasicNameValuePair("time",dt.toString()));
nameValuePairs.add(new BasicNameValuePair("latitude",lat));
nameValuePairs.add(new BasicNameValuePair("longitude",lon));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//Execute HTTP Post Request
response=httpclient.execute(httppost);
Log.v("Service Tracker Send Data", "MI Tracker\nUser: " + MI_Tracker.user + "\nTime: " + dt.toString() + "\nLat: " + latitude + "\nLong: " + longitude + "\n");
} catch(Exception e){
Log.e("Exception","Exception : " + e.getMessage());
}
} else {
Log.v("Sending Failed.","Sending Failed, no Internet.");
saveData();
}
} //end sendData
public void saveData() {
Log.v("Insert: ","Inserting ...");
db.addTrack(new Track(MI_Tracker.userid, "track", MI_Tracker.timeType, dt.toString(),lat,lon));
}
public void sendSavedData(){
List<Track> tracks = db.getAllTracks();
for(Track tr : tracks) {
boolean del = false;
try {
//send data to server
httpclient = new MyHttpClient().getNewHttpClient();
httppost= new HttpPost(Config.serverAdd); // make sure the url is correct.
nameValuePairs = new ArrayList<NameValuePair>(7);
// Always use the same variable name for posting i.e the android side variable name and php side variable name should be similar,
nameValuePairs.add(new BasicNameValuePair("cmd","tracking"));
nameValuePairs.add(new BasicNameValuePair("userid",tr.getUserID())); // $userid = $_POST['userid'];
nameValuePairs.add(new BasicNameValuePair("operationType","track"));
nameValuePairs.add(new BasicNameValuePair("timeType",tr.getTimeType()));
nameValuePairs.add(new BasicNameValuePair("time",tr.getTime()));
nameValuePairs.add(new BasicNameValuePair("latitude",tr.getLatitude()));
nameValuePairs.add(new BasicNameValuePair("longitude",tr.getLongitude()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//Execute HTTP Post Request
response=httpclient.execute(httppost);
Log.v("Service Send Saved Data: ", "MI Tracker\nUser: " + tr.getUserID()+ "\nTime: " + tr.getTime() + "\nLat: " + tr.getLatitude() + "\nLong: " + tr.getLatitude());
//Toast.makeText(getApplicationContext(), "MI Tracker Sending Data\nUser: " + MI_Tracker.user + "\nTime: " + dt.toString() + "\nLat: " + latitude + "\nLong: " + longitude + "\n", Toast.LENGTH_LONG).show();
//delete data after sending it 05-27
Log.v("Deleting Data","Deleting Data with ID: " + tr.getID());
del = true;
} catch(Exception e){
del = false;
Log.e("Exception on sendSaveData","Exception : " + e.getMessage());
}
//delete the data when there's no error in sending the data
if(del){
db.deleteTrack(tr);
} else {
Log.v("Service Send Saved Data:","There's an error. Data retained");
}
}
} //end sendSavedData()
} //end class
日志猫:
05-31 10:02:06.375: D/dalvikvm(2945): GC_EXPLICIT freed 56K, 49% free 3584K/6919K, external 1503K/1811K, paused 48ms
05-31 10:02:22.890: V/MIServiceReceiver onReceive(2945): MIServiceReceiver Started
05-31 10:02:22.898: V/onStartCommand(2945): MIService2 Service Started
05-31 10:02:22.898: V/getLocation(2945): MyLocation getLocation
05-31 10:02:24.734: V/locationListenerNetwork(2945): Network onLocationChanged
05-31 10:02:24.734: V/MI Service(2945): MI Service gotLocation()
05-31 10:02:25.359: V/Service Tracker Send Data(2945): MI Tracker
05-31 10:02:25.359: V/Service Tracker Send Data(2945): User: clint
05-31 10:02:25.359: V/Service Tracker Send Data(2945): Time: Fri May 31 10:02:24 GMT+08:00 2013
05-31 10:02:25.359: V/Service Tracker Send Data(2945): Lat: 14.5804712
05-31 10:02:25.359: V/Service Tracker Send Data(2945): Long: 121.0599356
05-31 10:02:25.406: V/locationListenerNetwork(2945): Network onLocationChanged
05-31 10:02:25.406: V/MI Service(2945): MI Service gotLocation()
05-31 10:02:26.289: V/Service Tracker Send Data(2945): MI Tracker
05-31 10:02:26.289: V/Service Tracker Send Data(2945): User: clint
05-31 10:02:26.289: V/Service Tracker Send Data(2945): Time: Fri May 31 10:02:25 GMT+08:00 2013
05-31 10:02:26.289: V/Service Tracker Send Data(2945): Lat: 14.5806383
05-31 10:02:26.289: V/Service Tracker Send Data(2945): Long: 121.0591553
05-31 10:05:22.890: V/MIServiceReceiver onReceive(2945): MIServiceReceiver Started
05-31 10:05:22.890: V/onStartCommand(2945): MIService2 Service Started
05-31 10:05:22.890: V/getLocation(2945): MyLocation getLocation
05-31 10:05:24.570: V/locationListenerNetwork(2945): Network onLocationChanged
05-31 10:05:24.570: V/MI Service(2945): MI Service gotLocation()
05-31 10:05:25.234: D/dalvikvm(2945): GC_CONCURRENT freed 514K, 46% free 3803K/6919K, external 1503K/1811K, paused 3ms+3ms
05-31 10:05:25.234: D/Cursor(2945): Database path: trackingDB
05-31 10:05:25.234: D/Cursor(2945): Table name : null
05-31 10:05:25.234: D/Cursor(2945): Database path: userDB
05-31 10:05:25.234: D/Cursor(2945): Table name : null
05-31 10:05:25.234: D/Cursor(2945): Database path: trackingDB
05-31 10:05:25.234: D/Cursor(2945): Table name : null
05-31 10:05:25.257: D/Cursor(2945): Database path: trackingDB
05-31 10:05:25.257: D/Cursor(2945): Table name : null
05-31 10:05:25.257: D/Cursor(2945): Database path: userDB
05-31 10:05:25.257: D/Cursor(2945): Table name : null
05-31 10:05:25.390: V/Service Tracker Send Data(2945): MI Tracker
05-31 10:05:25.390: V/Service Tracker Send Data(2945): User: clint
05-31 10:05:25.390: V/Service Tracker Send Data(2945): Time: Fri May 31 10:05:24 GMT+08:00 2013
05-31 10:05:25.390: V/Service Tracker Send Data(2945): Lat: 14.580513
05-31 10:05:25.390: V/Service Tracker Send Data(2945): Long: 121.0596886
05-31 10:05:31.875: D/dalvikvm(2945): GC_EXPLICIT freed 214K, 48% free 3604K/6919K, external 1503K/1811K, paused 39ms
05-31 10:08:22.890: V/MIServiceReceiver onReceive(2945): MIServiceReceiver Started
05-31 10:08:22.890: V/onStartCommand(2945): MIService2 Service Started
05-31 10:08:22.890: V/getLocation(2945): MyLocation getLocation
05-31 10:08:24.609: V/locationListenerNetwork(2945): Network onLocationChanged
05-31 10:08:24.609: V/MI Service(2945): MI Service gotLocation()
05-31 10:08:25.531: V/Service Tracker Send Data(2945): MI Tracker
05-31 10:08:25.531: V/Service Tracker Send Data(2945): User: clint
05-31 10:08:25.531: V/Service Tracker Send Data(2945): Time: Fri May 31 10:08:24 GMT+08:00 2013
05-31 10:08:25.531: V/Service Tracker Send Data(2945): Lat: 14.5805303
05-31 10:08:25.531: V/Service Tracker Send Data(2945): Long: 121.0598834
05-31 10:08:32.015: D/dalvikvm(2945): GC_EXPLICIT freed 255K, 48% free 3598K/6919K, external 1503K/1811K, paused 40ms
05-31 10:08:32.015: D/Cursor(2945): Database path: trackingDB
05-31 10:08:32.015: D/Cursor(2945): Table name : null
05-31 10:08:32.015: D/Cursor(2945): Database path: userDB
05-31 10:08:32.015: D/Cursor(2945): Table name : null
05-31 10:11:22.890: V/MIServiceReceiver onReceive(2945): MIServiceReceiver Started
05-31 10:11:22.898: V/onStartCommand(2945): MIService2 Service Started
05-31 10:11:22.898: V/getLocation(2945): MyLocation getLocation
05-31 10:11:24.625: V/locationListenerNetwork(2945): Network onLocationChanged
05-31 10:11:24.625: V/MI Service(2945): MI Service gotLocation()
05-31 10:11:25.343: V/Service Tracker Send Data(2945): MI Tracker
05-31 10:11:25.343: V/Service Tracker Send Data(2945): User: clint
05-31 10:11:25.343: V/Service Tracker Send Data(2945): Time: Fri May 31 10:11:24 GMT+08:00 2013
05-31 10:11:25.343: V/Service Tracker Send Data(2945): Lat: 14.5805254
05-31 10:11:25.343: V/Service Tracker Send Data(2945): Long: 121.0595373
我在我的活动中使用警报管理器的方法:所以整个过程是,我的活动触发警报管理器,目的是启动服务接收器,而服务接收器具有服务的意图。
public void processTimeOn() {
Intent intent = new Intent(this, MIServiceReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval * 1000, pendingIntent);
Log.v("AlarmManager","Alarm starts in " + interval + " seconds.");
}
今天的日志有点不同。我确定服务 onStartCommand 被调用一次, gotLocation() 有时被调用两次。
任何反馈将不胜感激。谢谢。