1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Service aus Service (BroadcastReceiver) starten

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von andi86, 10.02.2011.

  1. andi86, 10.02.2011 #1
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Guten Morgen

    Ich habe vor einigen Tagen angefangen meine ersten App's für Android zu entwickeln, nun mein erstes Problem welches mich schon viele Stunden beschäftigt... :winki:

    Es gibt ein Service, der in der Manifest mit intent-filter registriert ist.
    Im OnReceive Teil dieses Services wird nun bei eintreffen des gewünschten Ereignisses ein kleines
    'Toast' angezeigt.

    Soweit so gut...

    In diesem Ereignis sollen später die Koordinaten des GPS gesucht werden.
    Da es das OnReceive Ereignis ja nicht gerne hat, wenn es 2 Minuten mit Arbeit beschäftigt ist,
    wollte ich in der OnReceive einen anderen Service starten.
    Doch ich habe schon alle im Internet entdeckten Möglichkeiten durchprobiert, einen Service zu starten und keine funktioniert.
    Entweder es geschieht einfach nichts oder der Debugger bleibt mit Fehler stehen und ich weiss nicht wie er es gerne hätte.

    Wahrscheinlich mache ich irgendwo einen kleinen Denkfehler...
    Das ganze sollte sich immer jeweils im Hintergrund abspielen, deshalb ein Service.
    Weiss jemand wie so etwas realisiert werden kann?

    Gruss Andi
     
  2. rushzero, 10.02.2011 #2
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Lager es doch in einen Thread aus, dann brauchst du keine 2. Service

    Hier mal ein beispiel falls du nicht weißt was ich meine
    Code:
    class DeinService extends ...
    {
    
       Thread t_gps;
       public void OnReceive (...){
          // GPS Daten besorgen
          t_gps = new Thread(new GPSData());
          t_gps.start();
       }
    }
    
    Code:
    class GPSData implements Runnable
    {
       public void run(){
          // GPS Daten besorgen
       }
    }
    
     
    Zuletzt bearbeitet: 10.02.2011
  3. andi86, 10.02.2011 #3
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Danke für die schnelle Antwort.

    Soweit scheint das zu funktionieren, zuminest kommt kein Fehler.

    Allerdings wollte ich nun im Thread eine Toast MessageBox auslösen und das passt dem Debugger nicht:

    Code:
     
    Toast.makeText(this, "Test...", Toast.LENGTH_SHORT).show();
    
    The method makeText(Context, CharSeq........) in the type Toast is not applicable for the arguments (GetGPSPos, String, int)

    Stimmt ein Paramter nicht?
     
  4. rushzero, 10.02.2011 #4
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Toast.makeText(DeinService.this, "Test...", Toast.LENGTH_SHORT).show();


    oder du gibst der GPSData Klasse mit dem Konstruktor den richtigen Context mit.
     
  5. andi86, 10.02.2011 #5
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Selber Fehler, sowohl mit <ServiceName>.this als auch mit <ThreadName>.this

    Andere Idee wo der Fehler liegt?

    Kompletter Code des Threads ist nun folgender:

    Code:
     
    package ch.rodev.test1;
     
    import android.widget.Toast;
     
    public class GetGPSPos implements Runnable {
     
    @Override
    public void run() {
    Toast.makeText(GetGPSPos.this, "GetGPSPos started", Toast.LENGTH_SHORT).show();
    }
     
    }
    
     
  6. rushzero, 10.02.2011 #6
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Jo wenn keine InnerClass machst musst halt den Context im Konstruktor oder mittels setter übergeben.

    Du brauchst halt einen richtigen Context
     
    Zuletzt bearbeitet: 10.02.2011
  7. andi86, 10.02.2011 #7
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Hm, was heisst einen richtigen Context?

    Das scheint der Punkt zu sein, der mir Probleme macht aber ich nicht weiss was ich denn machen müsste damit ich den richtigen Context bekomme.
     
  8. rushzero, 10.02.2011 #8
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Zuletzt bearbeitet: 10.02.2011
  9. andi86, 10.02.2011 #9
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Hab schon Stunden gelesen und nun bin ich an einem Punkt wo ich das mal in der Praktik umsetzen möchte um das zu festigen.
    Und die Probleme kommen eben leider erst in der Praktik :winki:

    Kannst du mir für diesen Fall sagen was wohl falsch ist?
    Nur so können sich bei mir allfällige Knöpfe lösen..
     
  10. rushzero, 10.02.2011 #10
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Lösung hab ich doch schon gepostet
     
  11. andi86, 10.02.2011 #11
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Leider bekomm ich das nicht zum laufen.

    Trotzdem vielen Dank für deine Unterstützung!

    Andi
     
  12. rushzero, 11.02.2011 #12
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    Dann musst halt mal deinen gesamten Code.. und Logcat meldungen
     
  13. andi86, 11.02.2011 #13
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Gerne:

    Service:

    Code:
    package ch.rodev.test1;
    
    import ch.rodev.test1.SUCSrv
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class SUCSrv extends BroadcastReceiver {
    t_gps = new Thread(new GetGPSPos());
    t_gps.start();
    }
    }
    Thread:

    Code:
    package ch.rodev.test1;
    
    import android.widget.Toast;
    
    public class GetGPSPos implements Runnable {
    
    @Override
    public void run() {
    Toast.makeText(GetGPSPos.this, "Test", Toast.LENGTH_SHORT).show();
    }
    }
    Und der Fehler wird beim makeText gemeldet:
    The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments...
     
    Zuletzt bearbeitet: 11.02.2011
  14. rushzero, 14.02.2011 #14
    rushzero

    rushzero Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    36
    Registriert seit:
    20.10.2010
    So setzt du deinen Context

    Code:
    package ch.rodev.test1;
    
    import android.widget.Toast;
    
    public class GetGPSPos implements Runnable {
    
     private mContext = null;
    
     public GetGPSPos(Context context){
       this.mContext = context;
     }
    
    @Override
    public void run() {
    Toast.makeText(this.mContext, "Test", Toast.LENGTH_SHORT).show();
    }
    }
    


    Das hier funktioniert nicht, Syntax Fehler eher:
    Code:
    package ch.rodev.test1;
    
    import ch.rodev.test1.SUCSrv
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class SUCSrv extends BroadcastReceiver {
    t_gps = new Thread(new GetGPSPos());
    t_gps.start();
    }
    }
    

    In deinem Service holst dann mit Context | Android Developersden Context und übergibst ihn im Konstruktor.
     
  15. andi86, 17.02.2011 #15
    andi86

    andi86 Threadstarter Neuer Benutzer

    Beiträge:
    13
    Erhaltene Danke:
    0
    Registriert seit:
    10.02.2011
    Scheint nun geklappt zu haben :)
    Nun gehts um die Sache mit der GPS Position im Thread..

    Danke für deine Unterstützung!
     

Diese Seite empfehlen