actividad de inicio de Android desde el servicio

151

Androide:

public class LocationService extends Service {

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

Lancé este servicio desde Activity

En Activitysi la condición satisface el comienzo

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

de lo LocationServicemencionado anteriormente no se pudo iniciar Activity, ¿cómo puedo obtener el contexto de la ejecución actual Activityen la clase de servicio?

d-man
fuente

Respuestas:

344

Desde dentro de la clase de servicio:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
d-man
fuente
17
Solo se necesita FLAG_ACTIVITY_NEW_TASK, ya que solo las actividades pueden iniciar actividades sin él. 'this' puede usarse en lugar de getBaseContext y getApplication ya que el servicio tiene su propio contexto.
Sojurn
1
¿Cómo eliminar mediante programación esa actividad de la lista de pantalla reciente?
Prashanth Debbadwar
2
No funciona si el servicio está en segundo plano. ¿Alguna solución para esto?
Rick Royd Aban
44
Por favor, ayúdenme para la aplicación abierta del servicio en segundo plano. Tengo el servicio Firebase (FCM). Quiero abrir la pantalla de My Calling UI desde mi aplicación, así que por favor
ayúdenme
2
Escribí su código dentro de mi servicio cuando la aplicación está en segundo plano, y veo que el servicio funcionó en xiaomi mi a2, pero no funciona en xiaomi redmi note 7, ¿puede ayudarme por qué funciona un dispositivo y el otro no?
Amjad Omari
18

Tuve el mismo problema y quiero hacerle saber que nada de lo anterior funcionó para mí. Lo que funcionó para mí fue:

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

y en una de mis subclases, almacenadas en un archivo separado, tuve que:

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

Todas las otras respuestas me dieron un nullpointerexception.

Andy
fuente
55
está almacenando el Servicio en un campo estático, lo que podría provocar una pérdida de memoria
Murmel
1
startActivity es lo mismo this.startActivity! crea una instancia inútil desde su servicio con startActivity normal igual, ¿por qué?
Amir Hossein Ghasemi
8

Otra cosa que vale la pena mencionar: si bien la respuesta anterior funciona bien cuando nuestra tarea está en segundo plano, la única forma en que podría hacerlo funcionar si nuestra tarea (hecha de servicio + algunas actividades) estaba en primer plano (es decir, una de nuestras actividades visibles al usuario) fue así:

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

No sé si ACTION_VIEW o FLAG_ACTIVITY_NEW_TASK tienen algún uso real aquí. La clave para tener éxito fue

storedActivity.startActivity(intent);

y, por supuesto, FLAG_ACTIVITY_REORDER_TO_FRONT por no volver a crear instancias de la actividad. ¡La mejor de las suertes!

Kellogs
fuente
1
Esto no funciona. Todo esto me da el error "Llamar a startActivity () desde fuera de un contexto de Actividad requiere el indicador FLAG_ACTIVITY_NEW_TASK. ¿Es esto realmente lo que quieres?"
Cerin
2
Esto se debe a que la segunda llamada a setFlags anula la primera. Esta solución debe usar addFlags, o una sola llamada para establecer marcas que pasen Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac
8
No desea combinar banderas con &&; quieres usar | (una sola barra para bit a bit o)
Jon Watte
Intención Intención = nueva intención (storeActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storeActivity.startActivity (intento);
Prakhar1001
1

uno no puede usar el Contextde la Service; pude obtener el (paquete) Contextpor igual:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);
Martin Zeitler
fuente
Creo que esto solo funciona con FLAG_ACTIVITY_NEW_TASKbandera
Cerlin
0

Alternativamente,

Puede usar su propia clase de aplicación y llamar desde donde lo necesite (especialmente las que no son actividades).

public class App extends Application {

    protected static Context context = null;

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

    public static Context getContext() {
        return context;
    }

}

Y registre su clase de aplicación:

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

Luego llame :

App.getContext();
James
fuente
2
Tenga cuidado de usar una instancia estática del contexto, puede provocar varias fugas de
memoria
1
@crgarridos Nope. Este es el contexto de la aplicación que es Singleton por su naturaleza y no conducirá a pérdidas de memoria
GV_FiQst
1
Cambiaría la línea context = getApplicationContext();acontext = this;
GV_FiQst