在android中定期向服务器发送当前位置

在android中定期向服务器发送当前位置,android,gps,Android,Gps,我必须定期(例如:每5分钟)将我的当前位置详细信息(lat和long)发送到服务器。有没有最好的办法?我知道如何获取当前位置以及如何将详细信息发送到服务器。但如何定期重复此操作?由于它不需要UI交互,您应该为此创建一个服务,该服务将调用requestLocationUpdates方法,在此方法中,将参数的最短时间传递到5分钟。使用 是发送定期请求的好选择 是使用BroadcastReceiver的教程。使用AlarmManager唤醒服务的最佳方法,并将您到达的位置发布到服务器。使用AlarmM

我必须定期(例如:每5分钟)将我的当前位置详细信息(lat和long)发送到服务器。有没有最好的办法?我知道如何获取当前位置以及如何将详细信息发送到服务器。但如何定期重复此操作?

由于它不需要UI交互,您应该为此创建一个服务,该服务将调用requestLocationUpdates方法,在此方法中,将参数的最短时间传递到5分钟。

使用 是发送定期请求的好选择


是使用BroadcastReceiver的教程。

使用
AlarmManager
唤醒服务的最佳方法,并将您到达的位置发布到服务器。

使用
AlarmManager
注册警报,以在用户首次打开应用程序5分钟后唤醒。创建一个服务(获取位置和服务器更新),以便在警报通知应用程序时运行。服务完成后,再次注册报警,5分钟后唤醒。这样你就能完成你的任务

参考号

第一次编辑-添加代码示例

步骤1-创建报警管理器并注册报警

AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(Main.this, YourWakefulReceiver.class);
bool flag = (PendingIntent.getBroadcast(Main.this, 0,
                intent, PendingIntent.FLAG_NO_CREATE)==null);
/*Register alarm if not registered already*/
if(flag){
PendingIntent alarmIntent = PendingIntent.getBroadcast(Main.this, 0,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Create Calendar obj called calendar
        Calendar calendar = Calendar.getInstance();

/* Setting alarm for every one hour from the current time.*/
int intervalTimeMillis = 1000 * 60 * 60; // 1 hour 
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), intervalTimeMillis,
                        alarmIntent);
}
步骤2-创建接收器类

public class YourWakefulReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Intent service = new Intent(context, SimpleWakefulService.class);
            startWakefulService(context, service);
        }
    }
}
Setp 3-创建服务类

public class SimpleWakefulService extends IntentService {

    private static String tagName = "YourService";

    public SimpleWakefulService() {
        super("YourService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        // Start your location
        LocationUtil.startLocationListener();
        try {
        // Wait for 10 seconds
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
        }
        //Stop location listener
        LocationUtil.stopLocationListener();
        // upload or save location
        uploadGps();

        SimpleWakefulReceiver.completeWakefulIntent(intent);
    }

}
步骤4-注册服务和接收器

<service android:name="com.envision.ghari.services.SimpleWakefulService"></service>
        <receiver android:name="com.envision.ghari.receivers.YourWakefulReceiver"></receiver>


注意:此代码是为了理解实现。它不会编译。

我正在开发一个应用程序,可以在10到15秒的时间内获取手机在服务中的全天位置,它工作正常,但有时网络提供商侦听器的方法OnLocationChanged停止被调用

 import android.location.Address;
    import android.location.Geocoder;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;
    import android.widget.TextView;


    import java.io.IOException;
    import java.util.List;

    import foodinn.databases.LocationUpdaterDatabase;

    public class LocationUpdatesActivity extends AppCompatActivity {
        private LocationUpdaterDatabase locationUpdaterDatabase;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_location_updates);

            locationUpdaterDatabase = new LocationUpdaterDatabase(this, "Locations.db", null, 1);

            final Geocoder geocoder = new Geocoder(this);

            ListView listView = (ListView) findViewById(R.id.locationUpdatesListView);

            listView.setAdapter(new SimpleCursorAdapter(this, R.layout.location_updates_list_view_view, locationUpdaterDatabase.getLocationUpdates(), new String[] {"latitude", "longitude", "whenUpdated"}, new int[] {R.id.listViewTextView1, R.id.listViewTextView2, R.id.listViewTextView3}, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER));

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    double latitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView1)).getText().toString());
                    double longitude = Double.valueOf(((TextView) view.findViewById(R.id.listViewTextView2)).getText().toString());

                    try {
                        List<Address> addressList = geocoder.getFromLocation(latitude, longitude, 1);

                        String address = addressList.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
                        String city = addressList.get(0).getLocality();
                        String state = addressList.get(0).getAdminArea();
                        String country = addressList.get(0).getCountryName();
                        String postalCode = addressList.get(0).getPostalCode();
                        String knownName = addressList.get(0).getFeatureName();

                        ((TextView) view.findViewById(R.id.listViewTextView4)).setText(address + ", " + city + ", " + country);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
导入android.location.Address;
导入android.location.Geocoder;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ListView;
导入android.widget.SimpleCursorAdapter;
导入android.widget.TextView;
导入java.io.IOException;
导入java.util.List;
导入foodinn.databases.LocationUpdaterDatabase;
公共类LocationUpdateActivity扩展了AppCompativeActivity{
私有位置更新数据库位置更新数据库;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u location\u更新);
locationUpdaterDatabase=新locationUpdaterDatabase(此“Locations.db”,null,1);
最终地理编码器地理编码器=新地理编码器(本);
ListView ListView=(ListView)findViewById(R.id.locationUpdatesListView);
listView.setAdapter(新的SimpleCorsorAdapter(此,R.layout.location_更新_列表_视图_视图,locationUpdaterDatabase.getLocationUpdates(),新字符串[]{“纬度”,“经度”,“whenUpdated”},新的int[]{R.id.listViewTextView1,R.id.listViewTextView2,R.id.listViewTextView3},SimpleCorsorAdapter.FLAG\U REGISTER\U内容观察者));
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
double latitude=double.valueOf(((TextView)视图.findViewById(R.id.listViewTextView1)).getText().toString());
double longitude=double.valueOf(((TextView)view.findViewById(R.id.listViewTextView2)).getText().toString());
试一试{
List addressList=geocoder.getFromLocation(纬度、经度,1);
String address=addressList.get(0).getAddressLine(0);//如果存在除此之外的任何其他地址行,请通过getMaxAddressLineIndex()检查最大可用地址行
字符串city=addressList.get(0.getLocation();
字符串状态=addressList.get(0.getAdminArea();
字符串country=addressList.get(0.getCountryName();
字符串postalCode=addressList.get(0.getPostalCode();
String knownName=addressList.get(0.getFeatureName();
((TextView)view.findViewById(R.id.listViewTextView4)).setText(地址+”,“+城市+”,“+国家/地区);
}捕获(IOE异常){
e、 printStackTrace();
}
}
});
}
}

我希望这个答案更具体一点。还要添加网络可用性检查。如果网络不可用,则将坐标存储在本地,并在网络存在时将其发送到服务器。请查看此应用程序,非常类似的应用程序,工作正常,但我需要一些关于一些功能的帮助,您在阅读我的帖子后会知道这些功能,很抱歉将此问题作为答案,因为我找不到评论选项。虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。