2012-05-08 10 views
7

quiero mantener mi aplicación que se ejecuta en segundo plano
tengo una aplicación que envía la ubicación del usuario a nuestro servidor
tengo el siguiente código:mantener aplicación que se ejecuta en segundo plano

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    LocationManager locationManager; 
    String context = Context.LOCATION_SERVICE; 
    locationManager = (LocationManager)getSystemService(context); 

    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    String provider = locationManager.getBestProvider(criteria, true); 

    updateWithNewLocation(null); 

    locationManager.requestLocationUpdates(provider, (10*60*1000), 10, 
              locationListener); 
} 
private final LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     updateWithNewLocation(location); 
    } 

    public void onProviderDisabled(String provider){ 
     updateWithNewLocation(null); 
    } 

    public void onProviderEnabled(String provider){ } 
    public void onStatusChanged(String provider, int status, 
           Bundle extras){ } 
    }; 
    public void updateWithNewLocation(Location location) { 


     if (location != null) { 
      Dbhelper helper = new Dbhelper(this); 
      final SQLiteDatabase db = helper.getWritableDatabase(); 
      long time = System.currentTimeMillis(); 
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss"); 
      final String curTime = df.format(time); 
      final double lat = location.getLatitude(); 
      final double lng = location.getLongitude(); 
      final double alt = location.getAltitude(); 
      System.out.println(lat); 
      System.out.println(lng); 
      System.out.println(alt); 
      db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " + 
      "('"+lng+"','"+lat+"','"+alt+"','"+curTime+"')"); 
      db.close(); 
      /*Timer timer = new Timer(); 
      timer.scheduleAtFixedRate(new TimerTask(){ 
       @Override 
       public void run(){ 
        db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " + 
          "('121.2149012','-6.217837','0.0','2012-05-07 10:20:01')"); 
        db.close(); 
       } 
      }, 10*60*1000, 10*60*1000);*/ 

      } 
     } 

Quiero que mi applicatioin para ejecutar en segundo plano. Quiero que se inicie automáticamente cuando el teléfono está encendido

+0

Existe un componente conocido como Servicio en Android. La documentación de Android dice que ** Un servicio es un componente de aplicación que puede realizar operaciones de larga ejecución en segundo plano y no proporciona una interfaz de usuario **. Para iniciar automáticamente su aplicación, puede usar AlarmManager. –

Respuesta

13

Una respuesta muy simple para su problema es usar Service. Te permitirá realizar diversas tareas mientras estás en segundo plano y es tu mejor opción para enviando tu ubicación al servidor en silencio.

Lea this para obtener ayuda.

+0

¿me puede dar un código de ejemplo simple? Gracias:) \ – akubabas

+0

+1 por simple y buena respuesta :) – Lucifer

+1

ver mi respuesta actualizada o leer [esto] (http://stackoverflow.com/a/2779589/966550) – waqaslam

0

Ejecute su lógica de fondo en un Service, y si quiere dar una buena experiencia en UX (y también tiene una prioridad más alta) publique un Notification en la barra de estado (usando NotificationManager).

0

Usted puede mantener su aplicación que se ejecuta en segundo plano usando Service

espero que este link le ayudará a

Lea la documentation para más detalles

0

Usted tiene que usar un servicio y una difusión receptor

+1

¿me pueden dar una código simple para esto? Gracias :) – akubabas

+0

@deadbabaz Puede obtener fácilmente el código para el servicio y el receptor de difusión desde el sitio del desarrollador de Android. – Dharmendra

0

GrabLocationDetails.java

Utilice este código como su GrabLocationDetails.java

public class GrabLocationDetails extends Service implements LocationListener { 

     double lat,lng; 
     private LocationManager locationManager; 
     private String provider; 
     boolean isGps; 
     private ArrayList<String> mList; 
     Context GLDContext; 

     public GrabLocationDetails(Context cont){ 
      this.GLDContext=cont; 
     } 
     public GrabLocationDetails(){} 
     @Override 
     public void onCreate() { 
      super.onCreate(); 
      mList = new ArrayList<String>(); 
      isGps = false; 
      lat=0.0; 
      lng=0.0; 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 

      //super.onStart(intent, startId); 

      try { 
       locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
       Criteria criteria = new Criteria(); 
       provider = locationManager.getBestProvider(criteria, false); 
       LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); 
       boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER); 
       if (!enabled) { 
        isGps = false; 
        ListAddItem(isGps); 
        SendBroadcast(); 
       } else { 
        isGps = true; 
        Location location = locationManager.getLastKnownLocation(provider); 
        lat=(location.getLatitude()); 
        lng=(location.getLongitude()); 
        ListAddItem(true); 
        SendBroadcast(); 
        locationManager.requestLocationUpdates(provider, 400, 1, this); 
       } 

      } catch (Exception e) { 
       ListAddItem(isGps); 
       SendBroadcast(); 
      } 
      return super.onStartCommand(intent, flags, startId); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      //locationManager.removeUpdates(this); 
     } 

     public void SendBroadcast(){ 
      Intent broadcastIntent = new Intent(); 
      broadcastIntent.setAction(CommandExecutionModule.LocationDetails); 
      broadcastIntent.putExtra("Data", mList); 
      sendBroadcast(broadcastIntent); 

     } 
     public void ListAddItem(boolean GPS) { 
      //if(!GPS) 
      //mList.add("0"); 
      //else 
      //mList.add("1"); 
      mList.add(Double.toString(lat)); 
      mList.add(Double.toString(lng)); 
     } 

     /**************************************************************************************************************/ 

     @Override 
     public void onLocationChanged(Location location){ 
      locationManager.requestLocationUpdates(provider, 400, 1, this); 
      mList.clear(); 
      lat = (location.getLatitude()); 
      lng = (location.getLongitude()); 
      ListAddItem(isGps); 
      SendBroadcast(); 
      locationManager.removeUpdates(this); 
      stopSelf(); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      locationManager.requestLocationUpdates(provider, 400, 1, this); 
     } 

     @Override 
     public void onProviderEnabled(String provider){ 
      isGps=true; 
     } 
     @Override 
     public void onProviderDisabled(String provider){ 
      isGps=false; 
      lat=0.0; 
      lng=0.0; 
      mList.clear(); 
      ListAddItem(isGps); 
      //SendBroadcast(); 
     } 
+0

En su clase de llamada, inicie este servicio y registre un receptor de difusión –

Cuestiones relacionadas