Php 尝试创建Android服务
我正在尝试制作一个Android服务,它应该在设备启动时启动。它应该每5分钟通过一个php web服务的帖子将位置数据发送到mySQL数据库 它应该发送以下数据:Php 尝试创建Android服务,php,android,mysql,android-service,Php,Android,Mysql,Android Service,我正在尝试制作一个Android服务,它应该在设备启动时启动。它应该每5分钟通过一个php web服务的帖子将位置数据发送到mySQL数据库 它应该发送以下数据: regID = same regId it used to register to GCM name = a user name latitude = the current latitude longitude = the current longitude 我以前从未做过保养,所以我对正确的保养方式感到困惑 如果你能指引我走向正
regID = same regId it used to register to GCM
name = a user name
latitude = the current latitude
longitude = the current longitude
我以前从未做过保养,所以我对正确的保养方式感到困惑
如果你能指引我走向正确的方向,我将不胜感激
这就是我到目前为止所做的:
package servicio;
import java.io.IOException;
import java.util.ArrayList;
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.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import android.app.Service;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import com.google.android.gcm.GCMRegistrar;
public class GeoService extends Service {
LocationManager manejador;
String proveedor;
Location localizacion;
LocationListener locListener;
String latitud, longitud;
final String regId = GCMRegistrar
.getRegistrationId(getApplicationContext());
// double latitud, longitud;
@Override
public void onCreate() {
manejador = (LocationManager) getSystemService(LOCATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Criteria req = new Criteria();
req.setAccuracy(Criteria.ACCURACY_FINE);
// Lista de proveedores por criterio
proveedor = manejador.getBestProvider(req, false);
localizacion = manejador.getLastKnownLocation(proveedor);
// location listener
locListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
latitud = String.valueOf(location.getLatitude());
longitud = String.valueOf(location.getLongitude());
Thread sendGpsPositionToDB = new Thread(new Runnable() {
@Override
public void run() {
String server = "http://www.grupobcn.es/aquacleanmessenger/";
String serverUrl = server + "addposicion.php";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("iddevice", regId));
params.add(new BasicNameValuePair("latitud", latitud));
params.add(new BasicNameValuePair("longitud", longitud));
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(serverUrl);
try {
httppost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpclient
.execute(httppost);
} catch (IOException e) {
}
}
});
sendGpsPositionToDB.start();
}
@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
}
};
manejador.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000,
0, locListener);
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intencion) {
return null;
}
}
包装服务;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
导入org.apache.http.util.EntityUtils;
导入android.app.Service;
导入android.content.Intent;
导入android.location.Criteria;
导入android.location.location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.os.IBinder;
导入com.google.android.gcm.gcmregistar;
公共类GeoService扩展服务{
地点经理manejador;
字符串校准器;
位置定位;
位置监听器位置监听器;
弦宽,弦长;
最终字符串regId=gcmregistar
.getRegistrationId(getApplicationContext());
//双纬度,长纬度;
@凌驾
public void onCreate(){
manejador=(位置管理器)getSystemService(位置服务);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
标准要求=新标准();
要求设定精度(标准精度要求);
//认证标准列表
proveedor=manejador.getBestProvider(req,false);
localizacion=manejador.getLastKnownLocation(proveedor);
//位置侦听器
locListener=新的LocationListener(){
@凌驾
已更改位置上的公共无效(位置){
latitud=String.valueOf(location.getLatitude());
longitud=String.valueOf(location.getlongitud());
Thread sendGPSpositionDB=新线程(new Runnable(){
@凌驾
公开募捐{
字符串服务器=”http://www.grupobcn.es/aquacleanmessenger/";
字符串serverUrl=server+“addposicion.php”;
List params=new ArrayList();
添加参数(新的BasicNameValuePair(“iddevice”,regId));
参数添加(新的BasicNameValuePair(“latitud”,latitud));
参数添加(新的BasicNameValuePair(“longitud”,longitud));
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(服务器URL);
试一试{
setEntity(新的UrlEncodedFormEntity(参数));
HttpResponse response=httpclient
.执行(httppost);
}捕获(IOE异常){
}
}
});
sendGPsPositionDB.start();
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
//TODO自动生成的方法存根
}
@凌驾
public void onStatusChanged(字符串提供程序,int状态,
捆绑(附加){
//TODO自动生成的方法存根
}
};
manejador.RequestLocationUpdate(LocationManager.GPS_提供程序,300000,
0,本地侦听器);
返回开始时间;
}
@凌驾
公共空间{
super.ondestory();
}
@凌驾
公共IBinder onBind(意向意向){
返回null;
}
}
您可以通过注册广播接收器并定义接收启动完成的权限来实现这一点
当用户安装应用程序时,操作系统将查看清单并注册自动启动。任何时候设备启动时,操作系统都会调用onReceive(),这样您就可以在那里启动服务,如下所示:
在您的舱单中:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service android:name=".GeoService" />
<receiver android:name="servicio.AutoStartGeo">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
并不是说如果应用程序安装在SD卡上,这将不起作用,因为在android.intent.action.BOOT_完成事件后,应用程序将不可用。您必须通知用户这一点,或通过以下方式强制在内部安装您的应用:android:installLocation=“internalOnly”
同样在Android 3.0及更高版本上,用户需要启动应用程序至少一次,应用程序才能接收Android.intent.action.BOOT_COMPLETED事件。Thx,这对于启动时启动问题非常有用。服务本身呢?我发布的代码有意义吗?这是正确的吗?这是有道理的。使用alarm manager或timertask每5分钟安排一次其余通话。在这里查看更多信息-
public class AutoStartGeo extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null){
Intent startServiceIntent = new Intent(context, GeoService.class);
context.startService(startServiceIntent);
}
}
}