vida tipos studio regresar pila navegar intent estados entre desde ciclo boton anterior activity actividades abrir android dialog fullscreen

android - tipos - Mantenga la actividad siempre en la parte superior de la pila, o en foco cuando las aplicaciones deshonestas inician actividades?



regresar a un activity anterior android (2)

Puede ejecutar un servicio en segundo plano que revise cada cierto tiempo para mantener su aplicación en la parte superior:

public class ServiceKeepInApp extends Service { //private static boolean sendHandler = false; KeepInAppHandler taskHandler = new KeepInAppHandler(this); @Override public void onCreate() { super.onCreate(); //sendHandler = true; taskHandler.sendEmptyMessage(0); } @Override public void onDestroy() { super.onDestroy(); //sendHandler = false; taskHandler.removeCallbacksAndMessages(0); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public IBinder onBind(Intent arg0) { return null; } private static class KeepInAppHandler extends Handler { private final WeakReference<ServiceKeepInApp> mService; private Context context; private boolean sendHandler = false; public KeepInAppHandler(ServiceKeepInApp mService) { this.mService = new WeakReference<ServiceKeepInApp>(mService); this.context = mService; this.sendHandler = true; } @Override public void handleMessage(Message msg) { super.handleMessage(msg); ActivityManager activityManager = (ActivityManager)context.getSystemService(Service.ACTIVITY_SERVICE); if (activityManager.getRecentTasks(2, 0).size() > 0) { if (activityManager.getRecentTasks(2, 0).get(0).id != GlobalVars.taskID) { activityManager.moveTaskToFront(GlobalVars.taskID, 0); } if (sendHandler) { sendEmptyMessageDelayed(0, 1000); } } } } }

Entonces tenga una clase singleton:

public static class GlobalVars { public static int taskID; public static Intent keepInApp; }

Luego en tu actividad:

public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GlobalVars.taskID = getTaskId(); GlobalVars.keepInApp = new Intent(this, ServiceKeepInApp.class); startService(GlobalVars.keepInApp); } }

Tengo una actividad inmersiva a pantalla completa que debe permanecer en pantalla completa hasta que el usuario salga explícitamente. (Por ejemplo, piense en algo como mirar un video de Youtube a pantalla completa).

Sin embargo, recientemente noté que muchas actividades no deseadas pueden romper el comportamiento de mi aplicación. Por ejemplo, muchas "aplicaciones gratuitas" oscuras tienden a generar actividades transparentes en pantalla completa y mostrar anuncios, lo que perturba al usuario de inmediato. Las ventanas emergentes de notificación de "pantalla completa" de ciertas aplicaciones que en realidad son actividades de pantalla completa también interrumpen instantáneamente mi actividad.

¿Hay alguna manera de evitar estas actividades robando el foco, o una forma de mantenerlos detrás de mi actividad de pantalla completa para que no rompa mi modo de pantalla completa? En otras palabras, ¿cómo puedo mantener mi actividad siempre en la cima cuando alguna aplicación deshonesta decide lanzar una actividad sobre la mía?

No es necesario que se cancelen, sino que se "dejen de lado por el momento" hasta que el usuario salga de la actividad de pantalla completa.

Un método que me viene a la mente sería relanzar mi actividad con FLAG_ACTIVITY_REORDER_TO_FRONT el momento en que pierda el foco, pero eso no se verá bonito para el usuario :(

Nota: Si desea probarlo usted mismo, he encontrado una aplicación que "simula" el lanzamiento de estas actividades fraudulentas. Descargue esto - https://play.google.com/store/apps/details?id=com.nlucas.popupnotificationslite&hl=es

Cada vez que recibe notificaciones, inicia una actividad transparente en pantalla completa. Intenta ver un video de Youtube y obtén 10 notificaciones de alguien e imagina cómo sería la distracción.

ACTUALIZACIÓN: Hacer esto no parece funcionar:

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { Intent i = new Intent(getBaseContext(), MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); startActivity(i); }


Su mejor opción es usar "fijación de pantalla" (como se presentó aquí , nuevo en Android L). Cualquier otra cosa es un truco o una solución alternativa que no será compatible con versiones anteriores.

Para ser franco, Android no fue diseñado para permitir que una aplicación se apodere de un dispositivo de forma incondicional. Android fue diseñado para ser una herramienta para el usuario que responde a sus deseos. Si su deseo es dejar una aplicación, ¿por qué debería ser tan difícil? Además, si el usuario desea tener aplicaciones con sombra que inician actividades inesperadas, entonces que así sea. Todos juegan según las mismas reglas establecidas por el sistema.