Service aus Service (BroadcastReceiver) starten

A

andi86

Neues Mitglied
0
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
 
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:
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?
 
Toast.makeText(DeinService.this, "Test...", Toast.LENGTH_SHORT).show();


oder du gibst der GPSData Klasse mit dem Konstruktor den richtigen Context mit.
 
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();
}
 
}
 
Jo wenn keine InnerClass machst musst halt den Context im Konstruktor oder mittels setter übergeben.

Du brauchst halt einen richtigen Context
 
Zuletzt bearbeitet:
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.
 
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..
 
Lösung hab ich doch schon gepostet
 
Leider bekomm ich das nicht zum laufen.

Trotzdem vielen Dank für deine Unterstützung!

Andi
 
Dann musst halt mal deinen gesamten Code.. und Logcat meldungen
 
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:
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.
 
Scheint nun geklappt zu haben :)
Nun gehts um die Sache mit der GPS Position im Thread..

Danke für deine Unterstützung!
 

Ähnliche Themen

Laser5001
  • Laser5001
Antworten
2
Aufrufe
897
Laser5001
Laser5001
R
  • Robby1950
2
Antworten
23
Aufrufe
1.004
Robby1950
R
B
Antworten
6
Aufrufe
1.049
jogimuc
J
Zurück
Oben Unten