Service aus Service (BroadcastReceiver) starten

  • 14 Antworten
  • Neuester Beitrag
Diskutiere Service aus Service (BroadcastReceiver) starten im Android App Entwicklung im Bereich Betriebssysteme & Apps.
A

andi86

Neues Mitglied
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
 
rushzero

rushzero

Fortgeschrittenes Mitglied
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:
A

andi86

Neues Mitglied
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?
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Toast.makeText(DeinService.this, "Test...", Toast.LENGTH_SHORT).show();


oder du gibst der GPSData Klasse mit dem Konstruktor den richtigen Context mit.
 
A

andi86

Neues Mitglied
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();
}
 
}
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Jo wenn keine InnerClass machst musst halt den Context im Konstruktor oder mittels setter übergeben.

Du brauchst halt einen richtigen Context
 
Zuletzt bearbeitet:
A

andi86

Neues Mitglied
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.
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Zuletzt bearbeitet:
A

andi86

Neues Mitglied
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..
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Lösung hab ich doch schon gepostet
 
A

andi86

Neues Mitglied
Leider bekomm ich das nicht zum laufen.

Trotzdem vielen Dank für deine Unterstützung!

Andi
 
rushzero

rushzero

Fortgeschrittenes Mitglied
Dann musst halt mal deinen gesamten Code.. und Logcat meldungen
 
A

andi86

Neues Mitglied
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:
rushzero

rushzero

Fortgeschrittenes Mitglied
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.
 
A

andi86

Neues Mitglied
Scheint nun geklappt zu haben :)
Nun gehts um die Sache mit der GPS Position im Thread..

Danke für deine Unterstützung!
 
Ähnliche Themen - Service aus Service (BroadcastReceiver) starten Antworten Datum
2