¿Cómo llevar más recientemente la actividad de terceros usados ​​a la delantera?

En mi aplicación, quiero programar la actividad de terceros más recientemente utilizada en el frente. Después de mirar otras respuestas aquí, he intentado relanzar la actividad usando el baseIntent devuelto de una lista de tareas recientes, pero eso no parece llevar la actividad al frente sobre cualquier otra cosa que está pasando.

Mi objetivo final es crear una aplicación que reemplaza la pantalla de llamadas entrantes con una pequeña superposición para que el usuario no se extraiga completamente de la aplicación que están utilizando cuando reciben una llamada. He encontrado que no puede reemplazar la pantalla predeterminada de llamada entrante (si esto no es cierto, háganoslo saber como prefiero hacerlo en su lugar), así como una solución alternativa, estoy intentando llamar a la aplicación utilizada más recientemente El frente de la pantalla (para superponer la pantalla de llamadas entrantes) y luego mostrar mi superposición encima de eso.

Aquí está el código que estoy usando (la actividad se inicia desde un receptor de difusión)

public class BringMRUAppToFront extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityManager activityManager = (ActivityManager) getSystemService("activity"); List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_WITH_EXCLUDED); if(recentTasks.size() > 2) { RecentTaskInfo recentTask = recentTasks.get(2); Intent testIntent = recentTask.baseIntent; Log.i("MyApp", "Recent task - " + recentTask.baseIntent.getComponent().getPackageName()); testIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(testIntent); } finish(); } } 

¿Hay una manera confiable de llevar cualquier actividad de terceros al frente? La actividad está garantizada para estar en la memoria (si uno no está en la memoria, entonces yo sólo mostraría la pantalla de inicio), por lo que no debería haber un problema allí. También no creo que sería un problema de seguridad en este caso, ya que sería sólo mostrar una aplicación que era visible justo antes de que el teléfono sonó – aunque entiendo que abrir esto en general en el SDK podría suponer un riesgo. .. todavía esperando que sea posible.

EDIT: Modificado el código ligeramente para reflejar lo que estoy haciendo. La tarea deseada casi siempre será la 3ª tarea de la lista: la primera es la tarea actual y la segunda es la tarea del teléfono que suena. Puedo llamar a la tarea al frente, pero no siempre está en el mismo estado (ir a la página del navegador en lugar de la pantalla de configuración en el navegador, por ejemplo). ¿Cómo hace esto la lista de tareas recientes?

Lo averiguó mirando el código fuente de Android: esto es exactamente lo que hace la pantalla Tareas recientes, tanto antes como después de Honeycomb:

 RecentTaskInfo recentTask = recentTasks.get(1); // task 0 is current task // maintains state more accurately - only available in API 11+ (3.0/Honeycomb+) if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.moveTaskToFront(recentTask.id, ActivityManager.MOVE_TASK_WITH_HOME); } else { // API 10 and below (Gingerbread on down) Intent restartTaskIntent = new Intent(recentTask.baseIntent); if (restartTaskIntent != null) { restartTaskIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); try { startActivity(restartTaskIntent); } catch (ActivityNotFoundException e) { Log.w("MyApp", "Unable to launch recent task", e); } } } 

Permiso android.permission.REORDER_TASKS es necesario para que esto funcione correctamente.

Comience desde Android L, getRecentTasks () devuelve las propias tareas de la aplicación y posiblemente otras tareas no sensibles (como Inicio), por lo que no puede realizar dicho trabajo.

Referencias: https://developer.android.com/preview/api-overview.html#Behaviors

¿Por qué no utiliza una variable estática global que se accede por todas las actividades y en su onPause sólo establecer esa variable a ese valor de la actividad Por ejemplo, estoy poniendo una variable estática llamada ActivityName

 public static String ActivityName = ""; 

Y en la onPause de cada actividad simplemente asignarle las actividades pacakage name

 @Override public void onPause() { super.onPause(); // The static global variable com.pacakagename.Utls.ActivityName = "com.pacakagename.Act1"; } 

Por lo tanto, cuando cualquiera de las pausas de la actividad el valor es assinged y llegará a conocer de la actividad más reciente en pausa y puede reiniciarlo con Class.forName (ActivityName)

  • ¿Cómo programar tematicamente una actividad para ser como un diálogo?
  • Android envía evento táctil a la actividad principal cuando se muestra el cuadro de diálogo
  • Relación entre android: noHistory y android: finishOnTaskLaunch
  • Evitar múltiples instancias de mi aplicación de Android compuesta por una sola actividad
  • ¿Cómo mostrar una actividad como pop-up en otra actividad?
  • OnSaveInstanceState no funciona
  • Envolvente de texto de Android
  • No se puede destruir la actividad (el servicio no está registrado)
  • ¿Cómo puedo saber si una actividad de Android ha finalizado desde un comando externo de adb?
  • ¿Cómo hacer que el trasfondo de una actividad sea translúcido?
  • Admob integración con pygame en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.