2010-08-31 23 views
114

Android:android Start-Aktivität von Service

public class LocationService extends Service { 

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     startActivity(new Intent(this, activity.class)); 
    } 
} 

startete ich diesen Dienst von Activity

In Activity, wenn die Bedingung erfüllt

startService(new Intent(WozzonActivity.this, LocationService.class)); 

von meinem LocationService beginnen oben erwähnt nicht Activity starten konnte, Wie kann ich Kontext der laufenden Activity in Service-Klasse bekommen?

Antwort

276

Aus dem Inneren der Service-Klasse:

Intent dialogIntent = new Intent(this, MyActivity.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(dialogIntent); 
+13

Nur der FLAG_ACTIVITY_NEW_TASK ist notwendig, da nur Aktivitäten Aktivitäten, ohne es beginnen.'this' kann anstelle von getBaseContext und getApplication verwendet werden, da der Dienst seinen eigenen Kontext hat. – Sojurn

+0

http://StackOverflow.com/a/24625619/3138818 – Hamidreza

+0

Wie programmatisch entfernen Sie diese Aktivität aus der letzten Bildschirmliste? –

8

Eine andere Sache, erwähnenswert: Während die Antwort oben ganz gut funktioniert, wenn unsere Aufgabe im Hintergrund ist der einzige Weg, konnte ich es funktioniert, wenn unsere Aufgabe (hergestellt von Service + war einige Aktivitäten) im Vordergrund (dh eine unserer Aktivitäten sichtbar zu Benutzer) war wie folgt aus:

Intent intent = new Intent(storedActivity, MyActivity.class); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    storedActivity.startActivity(intent); 

ich weiß nicht, ob ACTION_VIEW oder FLAG_ACTIVITY_NEW_TASK hier von jeder tatsächlichen Benutzung sind. Der Schlüssel zum Erfolg war

storedActivity.startActivity(intent); 

und natürlich FLAG_ACTIVITY_REORDER_TO_FRONT für nicht wieder die Aktivität instanziieren. Viel Glück!

+1

Dies funktioniert nicht. All dies gibt mir den Fehler "Aufruf von startActivity() von außerhalb eines Aktivitätskontextes erfordert das Flag FLAG_ACTIVITY_NEW_TASK. Ist das wirklich was Sie wollen?" – Cerin

+2

Dies liegt daran, dass der zweite Aufruf von setFlags den ersten überschreibt. Diese Lösung sollte addFlags oder einen einzelnen Aufruf verwenden, um Flags zu setzen, die Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT übergeben. – Fergusmac

+6

Sie möchten Flags nicht mit && kombinieren; du willst | benutzen (ein einzelner Balken für bitweise oder) –

14

Ich hatte das gleiche Problem, und möchte Sie wissen lassen, dass keiner der oben genannten für mich arbeitete. Was für mich gearbeitet wurde:

Intent dialogIntent = new Intent(this, myActivity.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
this.startActivity(dialogIntent); 

und in einem meiner Unterklassen, in einer separaten Datei gespeichert ich hatte:

die anderen Antworten gab mir alle
public static Service myService; 

myService = this; 

new SubService(myService); 

Intent dialogIntent = new Intent(myService, myActivity.class); 
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
myService.startActivity(dialogIntent); 

eine nullpointerexception.

+3

Sie speichern den Dienst in einem statischen Feld, was zu einem Speicherleck führen kann. – Murmel

+0

startActivity ist gleich this.startActivity! Sie erstellen eine nutzlose Instanz von Ihrem Dienst mit ist gleich normal startActivity, warum? –

-1

Alternativ

Sie können Ihre eigene Anwendungsklasse verwenden und rufen aus, wo immer Sie muss (vor allem nicht-Aktivitäten).

public class App extends Application { 

    protected static Context context = null; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
    } 

    public static Context getContext() { 
     return context; 
    } 

} 

und registrieren Sie Ihre Anwendungsklasse:

<application android:name="yourpackage.App" ... 

Dann rufen:

App.getContext(); 
+0

Achten Sie darauf, eine statische Instanz des Kontexts zu verwenden, da dies zu mehreren Speicherlecks führen kann – crgarridos

1

man kann nicht die Context des Service verwenden; konnte das (Paket) Context gleichermaßen bekommen:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class); 
Verwandte Themen