2012-04-22 5 views
8

Voglio fare un'attività che può essere aperta su QUALSIASI app.Avere un'applicazione in esecuzione sopra l'altra app

Normalmente, anche quando l'attività è impostata come finestra di dialogo, quando si passa a mio app, si vede la mia app, e sullo sfondo si vede il programma di avvio:

MA, voglio che la app andare sopra qualsiasi applicazione in questo modo: (fatto in photoshop):

ho visto questa domanda Creating a system overlay window (always on top), ma in ICS non c'è functionallity al layout. Inoltre, voglio dare una finestra di dialogo dalla mia app senza minimizzare l'altra app ...

+0

avete trovato la soluzione. Se sì, per favore aiutami su questo. – rup35h

risposta

21

ci sono un sacco di app che mostrano una vista mobile in cima a tutto come: airbrowser, LilyPad, Stick it, AirTerm, smart Taskbar, aircalc ...

in ogni caso, al fine di ottenere questa funzione, è necessario disporre di un permesso speciale chiamato "android.permission.SYSTEM_ALERT_WINDOW", e usare qualcosa di simile:

final WindowManager.LayoutParams param=new WindowManager.LayoutParams(); 
param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 
final View view=findViewById(R.id.my_floating_view); 
final ViewGroup parent=(ViewGroup)view.getParent(); 
if(parent!=null) 
    parent.removeView(view); 
param.format=PixelFormat.RGBA_8888; 
param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 
param.gravity=Gravity.TOP|Gravity.LEFT; 
param.width=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().width; 
param.height=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().height; 
final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
wmgr.addView(view,param); 
// TODO handle overlapping title bar and/or action bar 
// TODO you must add logic to remove the view 
// TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW 
// TODO if you wish to let the view stay when leaving the app, make sure you have a foreground service running. 
+0

E la vista funzionerà anche in ICS? –

+0

sicuro. l'ho persino testato circa un mese fa. non è che sia deprecato o altro. assicurati di gestire i casi speciali di cui ho scritto. nota che alcune delle cose che ho scritto sono opzionali (come la parte "param.format", che rende lo sfondo trasparente). sentiti libero di giocare con loro. riguardo all'effetto della sfocatura, non mi è familiare, ma sicuramente puoi cercare come farlo. –

+0

Grazie mille !! Funziona perfettamente! –

10

I' m uno degli sviluppatori di Tooleap SDK e abbiamo anche affrontato questo problema. Fondamentalmente, non è necessario utilizzare SYSTEM_ALERT_WINDOW per visualizzare un'attività su un'altra. Puoi semplicemente visualizzare un'attività regolare "ridotta" con uno sfondo trasparente.

di fare una "attività shrinked, modificare le params struttura della finestra di attività di altezza e larghezza:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.x = ...; 
params.y = ...; 
params.width = ...; 
params.height = ...; 

this.getWindow().setAttributes(params); 

Per fare uno sfondo trasparente aggiungere alla definizione di attività nel file manifesto:

android:theme="@android:style/Theme.Translucent" 

In questo modo è possibile creare l'illusione di un'attività mobile:

Si noti che verrà ripresa solo l'attività in primo piano, mentre quella di sfondo è pau sed. Ma per la maggior parte delle app questo non dovrebbe essere un problema.

Ora non resta che lanciare l'attività floating.

Ecco un esempio di un'app calcolatrice "mobile" che utilizza un'attività regolare. Nota che l'attività sotto la calcolatrice appartiene a un'altra app.

Tooleap Calculator Screenshot

+0

Ma questo significa che tutto ciò che hai fatto è stato mettere un'attività in cima all'attività di un'altra app, quindi se fai clic sul pulsante Indietro, ciò influenzerà la tua attività e non quella dietro. Per fare qualcosa che galleggia realmente e non gestisce ciò che dovrebbe essere gestito, questo metodo non funzionerà ... –

+1

Tutto dipende dal tipo di esperienza utente che stai cercando di raggiungere. Se si desidera visualizzare un piccolo pulsante mobile che non interferisce con l'attività sottostante, allora sì, non sarà una buona soluzione. Ma se vuoi mostrare un piccolo schermo a cui l'utente deve occuparsi prima di continuare il suo lavoro (qualcosa come una finestra di dialogo), allora una piccola attività potrebbe essere una buona soluzione. – Danny

+1

hmmmm ... ora che ho riletto la domanda, non è chiaro quale sia esattamente il comportamento necessario. Quindi hai ragione. –

Problemi correlati