attività di avvio Android dal servizio


151

Android:

public class LocationService extends Service {

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

Ho lanciato questo servizio da Activity

In Activityse la condizione soddisfa l'inizio

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

dal mio LocationServicesopra menzionato non è stato possibile avviare Activity, come posso ottenere il contesto di esecuzione corrente Activitynella classe di servizio?

Risposte:


344

Dall'interno della classe di servizio:

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

17
È necessario solo FLAG_ACTIVITY_NEW_TASK poiché solo le attività possono iniziare attività senza di essa. 'this' può essere usato al posto di getBaseContext e getApplication poiché il servizio ha il suo contesto.
Sojurn,

1
Come rimuovere a livello di programmazione quell'attività dall'elenco di schermate recenti?
Prashanth Debbadwar,

2
Non funziona se il servizio è in background. Qualche correzione per questo?
Rick Royd Aban,

4
Aiutatemi per un'applicazione aperta dal servizio in background Ho usato il servizio Firebase (FCM). Voglio aprire la schermata dell'interfaccia utente di My Calling dalla mia app Quindi, per favore, aiutatemi per questo
Dipanki Jadav,

2
Ho scritto il tuo codice all'interno del mio servizio quando l'app è in background e vedo che il servizio ha funzionato su xiaomi mi a2, ma non funziona su xiaomi redmi note 7, puoi aiutarmi perché funziona un dispositivo e uno no?
Amjad Omari,

18

Ho avuto lo stesso problema e voglio farti sapere che nessuna delle precedenti ha funzionato per me. Ciò che ha funzionato per me è stato:

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

e in una delle mie sottoclassi, memorizzate in un file separato ho dovuto:

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

Tutte le altre risposte mi hanno dato a nullpointerexception.


5
stai memorizzando il Servizio in un campo statico, che potrebbe causare perdite di memoria
Murmel,

1
startActivity è lo stesso this.startActivity! crei un'istanza inutile dal tuo servizio con uguale startActivity uguale, perché?
Amir Hossein Ghasemi,

8

Un'altra cosa degna di nota: mentre la risposta sopra funziona bene quando il nostro compito è in background, l'unico modo in cui potrei farlo funzionare se il nostro compito (fatto di servizio + alcune attività) era in primo piano (cioè una delle nostre attività visibili all'utente) era così:

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

Non so se ACTION_VIEW o FLAG_ACTIVITY_NEW_TASK siano effettivamente utili qui. La chiave per avere successo è stata

storedActivity.startActivity(intent);

e ovviamente FLAG_ACTIVITY_REORDER_TO_FRONT per non aver nuovamente creato un'istanza dell'attività. Buona fortuna!


1
Questo non funziona. Tutto ciò mi dà l'errore "Chiamare startActivity () dall'esterno di un contesto Activity richiede il flag FLAG_ACTIVITY_NEW_TASK. È davvero quello che vuoi?"
Cerin,

2
Questo perché la seconda chiamata a setFlags sovrascrive la prima. Questa soluzione dovrebbe utilizzare addFlags o una singola chiamata per impostare flag che superano Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac,

8
Non vuoi combinare le bandiere con &&; vuoi usare | (una barra singola per bit a bit o)
Jon Watte,

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

1

non si può usare il Contextdi Service; è stato in grado di ottenere il (pacchetto) Contextallo stesso modo:

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

Penso che FLAG_ACTIVITY_NEW_TASK
funzioni

0

In alternativa,

È possibile utilizzare la propria classe di applicazione e chiamare ovunque sia necessario (in particolare non attività).

public class App extends Application {

    protected static Context context = null;

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

    public static Context getContext() {
        return context;
    }

}

E registra la tua classe di applicazione:

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

Quindi chiama:

App.getContext();

2
Prenditi cura di usare un'istanza statica del contesto, può portare a perdite di
memoria gravi

1
@crgarridos Nope. Questo è il contesto dell'applicazione che è Singleton per sua natura e non porterà a perdite di memoria
GV_FiQst

1
Vorrei cambiare la linea context = getApplicationContext();incontext = this;
GV_FiQst

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.