Android Start Aktivität aus dem Dienst

150

Android:

public class LocationService extends Service {

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

Ich habe diesen Dienst von gestartet Activity

In Activitywenn Bedingung Start erfüllt

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

von meinem LocationServiceoben genannten konnte nicht gestartet werden Activity, wie kann ich den Kontext der aktuellen Ausführung Activityin der Serviceklasse erhalten?

D-Mann
quelle

Antworten:

343

Aus der Serviceklasse heraus:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
D-Mann
quelle
17
Es wird nur die FLAG_ACTIVITY_NEW_TASK benötigt, da nur Aktivitäten Aktivitäten ohne diese starten können. 'this' kann anstelle von getBaseContext und getApplication verwendet werden, da der Dienst einen eigenen Kontext hat.
Sojurn
1
Wie kann ich diese Aktivität programmgesteuert aus der Liste der letzten Bildschirme entfernen?
Prashanth Debbadwar
2
Funktioniert nicht, wenn sich der Dienst im Hintergrund befindet. Irgendeine Lösung dafür?
Rick Royd Aban
4
Bitte helfen Sie mir für eine offene Anwendung vom Hintergrunddienst, für den ich den Firebase (FCM) -Dienst verwendet habe. Ich möchte den Bildschirm "Meine
anrufende
2
Ich habe Ihren Code in meinen Dienst geschrieben, wenn sich die App im Hintergrund befindet, und ich sehe, dass der Dienst auf xiaomi mi a2 funktioniert hat, aber nicht auf xiaomi redmi note 7. Können Sie mir helfen, warum ein Gerät funktioniert und eines nicht?
Amjad Omari
18

Ich hatte das gleiche Problem und möchte Sie wissen lassen, dass keines der oben genannten Probleme bei mir funktioniert hat. Was für mich funktioniert hat war:

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

und in einer meiner Unterklassen, die in einer separaten Datei gespeichert waren, musste ich:

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);

Alle anderen Antworten gaben mir eine nullpointerexception.

Andy
quelle
5
Sie speichern den Dienst in einem statischen Feld, das zu einem Speicherverlust führen kann
Murmel
1
startActivity ist dasselbe this.startActivity! Sie erstellen eine nutzlose Instanz aus Ihrem Dienst mit der gleichen normalen startActivity, warum?
Amir Hossein Ghasemi
8

Eine weitere erwähnenswerte Sache: Während die obige Antwort gut funktioniert, wenn unsere Aufgabe im Hintergrund ist, könnte ich sie nur dann zum Laufen bringen, wenn unsere Aufgabe (aus Service + einigen Aktivitäten) im Vordergrund steht (dh eine unserer Aktivitäten sichtbar ist) zum Benutzer) war wie folgt:

    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 tatsächlich von Nutzen sind. Der Schlüssel zum Erfolg war

storedActivity.startActivity(intent);

und natürlich FLAG_ACTIVITY_REORDER_TO_FRONT, weil die Aktivität nicht erneut instanziiert wurde. Viel Glück!

Kellogs
quelle
1
Das funktioniert nicht. Das alles gibt mir den Fehler "Das Aufrufen von startActivity () von außerhalb eines Aktivitätskontexts erfordert das Flag FLAG_ACTIVITY_NEW_TASK. Ist dies wirklich das, 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
8
Sie möchten keine Flags mit &&; Sie möchten | verwenden (ein einzelner Balken für bitweise oder)
Jon Watte
Intent intent = new Intent (gespeicherte Aktivität, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); savedActivity.startActivity (Absicht);
Prakhar1001
1

man kann nicht die Verwendung Contextder Service; konnte das (Paket) Contextgleich bekommen:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);
Martin Zeitler
quelle
Ich denke, das funktioniert nur mit FLAG_ACTIVITY_NEW_TASKFlagge
Cerlin
0

Abwechselnd,

Sie können Ihre eigene Anwendungsklasse verwenden und von jedem Ort aus anrufen (insbesondere bei 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 ruf an :

App.getContext();
James
quelle
2
Achten Sie darauf, eine statische Instanz des Kontexts zu verwenden, da dies zu mehreren Speicherlecks führen kann
Crgarridos,
1
@crgarridos Nein. Dies ist der Anwendungskontext, der von Natur aus Singleton ist und nicht zu Speicherlecks führt
GV_FiQst
1
Ich würde die Zeile context = getApplicationContext();incontext = this;
GV_FiQst
-1

Wenn Sie eine Aktivität, die sich in bacgrounde befindet, von Ihrem Dienst zurückrufen müssen, schlage ich den folgenden Link vor. Intent.FLAG_ACTIVITY_NEW_TASK ist nicht die Lösung.

https://stackoverflow.com/a/8759867/1127429

GMG
quelle