2016-02-07 19 views
13

Ho un'attività immersiva a schermo intero che deve rimanere a schermo intero fino all'uscita esplicita dell'utente. (Ad esempio, pensa a qualcosa come guardare un video Youtube a schermo intero).Mantieni l'attività sempre in primo piano o messa a fuoco quando le app rogue lanciano attività?

Tuttavia, ho notato di recente che un sacco di attività indesiderate di avvio può rompere il comportamento della mia app. Ad esempio, molte "app gratuite" ombreggiate tendono a generare attività trasparenti a schermo intero e a mostrare annunci, interrompendo immediatamente l'utente. I popup di notifica "a schermo intero" di alcune app che sono in realtà attività a schermo intero interrompono immediatamente la mia attività.

C'è un modo per evitare queste attività che rubano l'attenzione, o un modo per tenerle dietro la mia attività a schermo intero in modo che non si rompa la mia modalità a schermo intero? In altre parole, come posso mantenere la mia attività sempre in primo piano ogni volta che qualche app canaglia decide di avviare un'attività sul mio?

Non è necessario che siano annullati, ma "rimandati al momento" fino a quando l'utente non chiude l'attività a schermo intero.

Un metodo che viene in mente sarebbe quello di rilanciare la mia attività con FLAG_ACTIVITY_REORDER_TO_FRONT nel momento in cui non è più attivo, ma che non guardare piuttosto per l'utente :(

Nota: se volete provare voi stessi Ho trovato un'app che "simula" l'avvio di queste attività canaglia Scarica questo - https://play.google.com/store/apps/details?id=com.nlucas.popupnotificationslite&hl=en

Ogni volta che si ricevono notifiche, viene avviata un'attività a schermo intero trasparente Prova a guardare un video di YouTube e ricevi 10 notifiche da qualcuno e immagina quanto sarebbe distratto

UPDATE: Facendo questo non sembra funzionare:

@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); 
} 
+0

che tipo di app gratuite rubano la tua attenzione? quando guardo il video di YouTube non c'è mai niente da vedere – LamaTo

+0

Ho modificato la domanda per includere quell'informazione. Il problema – Kyle

+0

con onWindowFocusChanged è che non è possibile aprire la finestra di dialogo all'interno della propria attività. puoi superare questo problema con 'if (! hasFocus &&! mDialogList.isShowing()) {...' –

risposta

4

È possibile eseguire un servizio in background che controlla ogni tanto che manterrà la vostra applicazione sulla parte superiore:

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


    } 

} 

} 

Allora date classe singleton:

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

} 

Poi nella vostra attività:

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); 
    } 
} 
+0

Probabilmente è saggio interrompere questo servizio alla fine del processo che viene eseguito in primo piano in ogni momento. Piuttosto, smetti di inviare messaggi e callback, giusto? Anche GlobalVars non ha bisogno di essere statico stesso, solo i vars. –

1

La soluzione migliore è utilizzare "blocco schermo" (come introdotto here, nuovo in Android L). Qualsiasi altra cosa è un trucco o una soluzione alternativa che non sia compatibile con il futuro.

Per essere sincero, Android non è stato progettato per consentire a un'app di occuparsi incondizionatamente e completamente di un dispositivo. Android è stato progettato per essere uno strumento per l'utente che risponde ai loro desideri. Se il loro desiderio è di lasciare un'app, perché dovrebbe renderlo difficile? Inoltre, se l'utente desidera avere app ombreggiate che attivano inaspettatamente attività, allora così sia. Ognuno gioca secondo le stesse regole stabilite dal sistema.

+1

Ciò richiederà all'utente di accettare il blocco dello schermo, non desiderabile. È spiegato qui: http://android.stackexchange.com/questions/85013/how-to-enable-task-locking-in-android-5-0-production-devices –

+1

Come ho detto, quello che stai cercando di non è consigliabile per l'utente finale su dispositivi di uso generale. Ecco perché richiede tutti questi passaggi aggiuntivi. Ma questa è la struttura che ti viene assegnata. È una specie di prendere o lasciare proposizione. –

Problemi correlati