2012-05-08 12 views
7

Ich möchte meine Anwendung halten im Hintergrund laufen
Ich habe eine Anwendung, die den Standort des Nutzers auf unseren Server sendet
Ich habe den folgenden Code:halten Anwendung im Hintergrund laufen

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);*/ 

      } 
     } 

Ich möchte meine applicatioin im Hintergrund laufen. Ich möchte, dass es automatisch startet, wenn das Telefon eingeschaltet ist

+0

Es Komponente als Service im Android bekannt. Die Android-Dokumentation lautet: ** Ein Dienst ist eine Anwendungskomponente, die im Hintergrund lang andauernde Vorgänge ausführen kann und keine Benutzeroberfläche bietet **. Um Ihre App automatisch zu starten, können Sie AlarmManager verwenden. –

Antwort

13

Eine sehr einfache Antwort für Ihr Problem ist es, Service zu verwenden. Es erlaubt Ihnen, eine Vielzahl von Aufgaben durchzuführen, während Sie im Hintergrund sind und ist Ihre beste Wette für Senden Sie Ihren Standort an Server leise.

Lesen Sie this für Hilfe.

+0

können Sie mir einen einfachen Beispiel-Code geben? Danke:) \ – akubabas

+0

+1 für einfache und nette Antwort :) – Lucifer

+1

siehe meine aktualisierte Antwort oder lesen [this] (http://stackoverflow.com/a/2779589/966550) – waqaslam

0

Führen Sie Ihre Hintergrundlogik in einer Service aus, und wenn Sie eine gute UX-Erfahrung geben möchten (und auch eine höhere Priorität haben), geben Sie eine Notification in die Statusleiste ein (mit NotificationManager).

0

Sie Ihre Anwendung im Hintergrund laufen halten Service

mit hoffe, dass ich diese link Sie

helfen

Bitte lesen Sie die documentation für weitere Details

0

Sie haben einen Service und eine Übertragung zu verwenden, Empfänger

+1

können Sie mir geben einfacher Code zu diesem? Danke :) – akubabas

+0

@deadbabaz Sie können den Code für Service- und Rundfunkempfänger von der Entwicklerseite von Android leicht erhalten. – Dharmendra

0

GrabLocationDetails.java

Verwenden Sie diesen Code als 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

Starten Sie diesen Dienst in Ihrer Anrufklasse, und registrieren Sie einen Sendeempfänger –

Verwandte Themen