2010-08-31 27 views
114

Android:actividad de inicio androide del servicio

public class LocationService extends Service { 

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

que puso en marcha este servicio desde Activity

En Activity si satisface las condiciones de arranque

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

de mi LocationService mencionado anteriormente no podían lanzar Activity, ¿Cómo puedo obtener el contexto de la ejecución actual Activity en la clase de servicio?

Respuesta

276

Desde el interior de la clase de servicio:

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

Sólo se necesita la FLAG_ACTIVITY_NEW_TASK ya que sólo pueden iniciar actividades actividades sin ella.'this' se puede usar en lugar de getBaseContext y getApplication ya que el servicio tiene su propio contexto. – Sojurn

+0

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

+0

¿Cómo eliminar programáticamente esa actividad de la lista de pantallas recientes? –

8

Otra cosa vale la pena mencionar: mientras que la respuesta anterior funciona bien cuando nuestra tarea es en el fondo, la única manera que podría hacer que funcione si nuestra tarea (hizo de servicio + algunas actividades) estaba en el primer plano (es decir, una de nuestras actividades visibles para el usuario) fue la siguiente:

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 son de alguna utilidad real aquí. La clave del éxito fue

storedActivity.startActivity(intent); 

y de FLAG_ACTIVITY_REORDER_TO_FRONT curso para no crear instancias de la actividad de nuevo. ¡La mejor de las suertes!

+1

Esto no funciona. Todo esto me da el error "Llamar a startActivity() desde fuera del contexto de una 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 indicadores que pasan Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT. – Fergusmac

+6

No desea combinar banderas con &&; quieres usar | (una sola barra para bit a bit o) –

14

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 uno de mis subclases, almacenados en un archivo separado que tenía 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 dio un nullpointerexception.

+3

está almacenando el Servicio en un campo estático, lo que podría provocar una fuga de memoria – Murmel

+0

startActivity is this this.startActivity! usted crea una instancia inútil a partir de su servicio con la misma normalidad startActivity, ¿por qué? –

-1

Alternativamente,

Usted puede utilizar su propia clase de aplicaciones y llamar desde donde se necesita (especialmente los no 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 registrar su clase de aplicación:

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

Entonces llama:

App.getContext(); 
+0

Tenga cuidado de usar una instancia estática del contexto, puede llevar a varias a memorizar fugas – crgarridos

1

no se puede utilizar el Context del Service; fue capaz de obtener el (paquete) Context por igual:

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