Checken ob die App geschlossen wird order der Benutzer die Aktivität wechelt

  • 7 Antworten
  • Letztes Antwortdatum
T

the_time

Ambitioniertes Mitglied
0
Hallo,
ich versuche den locationManger in der TrackingService class zu entfernen wenn die App geschlossen wird order wenn der Buntzer den checkbox in der Menu von der MainAtivity checkt und NICHT wenn der Benutzer die activity wechselt. Ich mache das in der onDestroy(). Gbits eine Möglichkeit um in der onDestroy() zu checken ob die App geschlossen wird oder der Benutzer die activity wechelt?

Ich habe es mit isFinishing() versucht aber isFinishing wird in den beiden Fällen aufgerufen und liefert true zurück.

Code:
@Override
protected void onDestroy() {
    super.onDestroy();
    if(isFinishing()){
        Intent i = new Intent(this, TrackingService.class);
        stopService(i);
        System.out.println("ABC Map onDestroy() was invoked!" + isFinishing());

    }


}

Gruß,
the_time



MainActivity:


Code:
 public class MainActivity extends ActionBarActivity implements
       AsyncTaskCallback {
     TrackingService mService;
     boolean mBound = false;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.route_available);
       // Start the TrackingService class.
       Intent i = new Intent(this, TrackingService.class);
       startService(i);
     }


     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
       MenuInflater inflater = getMenuInflater();
       inflater.inflate(R.menu.main_menu, menu);
       System.out.println("test onCreateOptionsMenu was invoked.");

       return true;
     }

     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
       MenuItem checkable = menu.findItem(R.id.checkable_menu);
       checkable.setChecked(isChecked);
       return true;
     }

     // Start and stop the background service.
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
       case R.id.checkable_menu:
         if (isChecked = !item.isChecked()) {
           item.setChecked(isChecked);
           Intent i = new Intent(this, TrackingService.class);
           startService(i);
           System.out.println("test if onOptionsItemSelected");
         } else {
           mService.stopTrackingService();

         }
         return true;

       default:
         return false;
       }
     }
   @Override
   protected void onDestroy() {
     super.onDestroy();
     Intent i = new Intent(this, TrackingService.class);
     stopService(i);
    }

  }

TrackingService class:
Code:
public class TrackingService extends Service implements AsyncTaskCallback,
       LocationListener {
  LocationManager lm;
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
       detectLocation();
       return START_STICKY;
     }
     private void detectLocation() {
       // TODO Auto-generated method stub
       Toast.makeText(this, "Inside detectlocation()", Toast.LENGTH_SHORT)
           .show();
       lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
       lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30 * 1000, 0,
           this);
       enableGPS(lm);

     }
     @Override
   @Override
   public void onDestroy() {
     super.onDestroy();
     unregisterReceiver(wifi_receiver);
     System.out.println("ABC TrackingService onDestroy() was invoked.");
     if(lm != null){
       lm.removeUpdates(this);
       System.out.println("ABC TrackingService lm was removed.");
     }else{
       System.out.println("ABC TrackingService lm locationManager is null.");
  
     }
    }
     public void stopTrackingService(){
     lm.removeUpdates(this);
    }
  }

Map activity:

Code:
public class Map extends FragmentActivity implements OnMapReadyCallback, ConnectionCallbacks, OnConnectionFailedListener{
    @Override
    protected void onDestroy() {
        super.onDestroy();
// To stop the service when the user closed the app in the background and the map ativity was opened.    
        stopAlarm();
        Intent i = new Intent(this, TrackingService.class);
        stopService(i);
        System.out.println("ABC Map onDestroy() was invoked!");

    }

}
 
Zuletzt bearbeitet:
Hallo, warum löst du das nicht über onPause()? (onDestroy() wird dich hier nicht weiterbringen, wenn ich das Problem richtig verstanden habe)
 
Du meinst ich soll in onPause() den locationManager entfernen also die App muss in background die aufgenommen Daten an den Server schicken und wenn der Benutzer zwischen den Aktivitäten wechelt.
 
Eigentlich sollte isFinishing() nur true zurückgeben wenn die Activity wirklich gefinished wird....habe keine Probleme damit gehabt...

vllt hilft dir der ActivityManager?
ActivityManager | Android Developers

Ich habe die mri jetzt nchiht durchgeschaut aber vllt ist da etwas das dir hilft.

BTW:
Code:
public static boolean isUserAMonkey ()

Added in API level 8
Returns "true" if the user interface is currently being messed with by a monkey.

Wtf? Ist das so ein Spaß von Google oder ist das etwas seriöses hahahahahha?`Die können das nciht ernst meinen oder doch?

edit: UI/Application Exerciser Monkey | Android Developers ok dachte ich mir dch das es etwas seriöses ist ^^
war lustig als ich das gesehen habe aber...
Dachte damit sind echte User gemeint :D
 
Was ich nicht verstehe wieso wird onDestroy() - TrackingService nicht aufgerufen wenn ich zum ersten mal den Knopf klicke denn ich werde zu der Map activity weitergeleitetaber wenn ich vom Map -> zu Mainactivity zurückgehen dann funktiniert der service immer noch aber wenn ich den Knopf nochmal in der MainActivity klicke dann wird onDestroy() - TrackingService aufgerufen und daraufhin wird der locationManager entfernt.
 
Deine Map Activity fehlt du hast nur die Überschrift gesetzt....man kann auch schwer was sagen wenn der Code für das Ganze fehlt

Die if Abfrage in onOptionSelected() ist ein eifnaches "=" ausserdem
 
Ich habe den Code von der Map activity hinzugefügt.Entschuldigung denn Ich habe es gestern ganz nix gemerkt.

Komisch is es nur ein "=" und funktioniert. Ich habe ein zweites gleich Zeichen hinzugefügt.
[DOUBLEPOST=1440926505,1440924609][/DOUBLEPOST]Ich habe gemwerkt dass onDestroy() von den beiden activity nicht immer gerufen werden:

1. Wenn ich die App starte und sie in den Hindergrund mit geöffneten MainActivity bringe, dannach schließe ich die App (onDestroy() von der MainActivity wird aufgerufen. Der service wird gestoppt)

2. Wenn ich die App starte, dann gehe ich MainActivity -> Map activity und die App in den Hindergrund mit geöffneten Map bringe, dannach schließe ich die App (onDestroy() von der Map activity wird aufgerufen. Service wird gestoppt)

3. Wenn ich die App starte, dann gehe ich MainActivity -> Map -> MainActivity - und die App in den Hindergrund mit geöffneten MainActivity bringe, dannach schließe ich die App (onDestroy() von der MainActivity wird nicht aufgerufen aber der Service wird gestopt)

4. Wenn ich die App starte, dann gehe ich MainActivity -> Map activity -> MainActivity -> Map activity und die App in den Hindergrund mit geöffneten Map bringe, dannach schließe ich die App (onDestroy() von der Map activity wird NICHT aufgerufen. Service wird NICHT gestoppt)

Gibts dafür eine plausibele Erklärung?
 
Das mit "Die if Abfrage in onOptionSelected() ist ein eifnaches "=" ausserdem" wenn ich es durch "==" ersetze dann kriege dann kann ich den checkbox nicht mehr entfernen also mit ein "=" funktiniert. Ich habe diesen Code schnipsel bei stackoverflow so gefunden.
 

Ähnliche Themen

G
Antworten
0
Aufrufe
132
Gerdchen07
G
G
Antworten
1
Aufrufe
384
Gerdchen07
G
G
Antworten
13
Aufrufe
596
Gerdchen07
G
L
Antworten
2
Aufrufe
553
Lexub
L
migi01
Antworten
26
Aufrufe
1.985
migi01
migi01
Zurück
Oben Unten