2012-04-22 11 views
8

Chcę utworzyć działanie, które można otworzyć nad DOWOLNĄ aplikacją.Po uruchomieniu aplikacji nad inną aplikacją

Normalnie, nawet wtedy, gdy działalność ta jest ustawiona jako okna, po przełączeniu do mojego app, widzisz moją aplikację, aw tle widać wyrzutni:

ALE, chcę Aplikacja będzie iść wyżej dowolnej aplikacji takich jak to: (made in Photoshop):

widziałem to pytanie Creating a system overlay window (always on top), ale w ICS nie ma funkcjonalność do układu. Ponadto chcę podać okno dialogowe z mojej aplikacji bez minimalizowania drugiej aplikacji ...

+0

czy znalazłeś rozwiązanie. Jeśli tak, pomóżcie mi w tej sprawie. – rup35h

Odpowiedz

21

Istnieje wiele aplikacji, które pokazują pływający widok na wszystko, jak: airbrowser, LilyPad, Stick it, AirTerm, inteligentny pasek zadań, aircalc ...

tak, aby osiągnąć tę funkcję, trzeba mieć specjalne pozwolenie o nazwie „android.permission.SYSTEM_ALERT_WINDOW” i używać coś takiego:

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

Czy widok będzie funkcjonował nawet w ICS? –

+0

pewnie. Testowałem go nawet miesiąc temu. to nie jest tak, że jest przestarzałe lub cokolwiek. po prostu zajmij się specjalnymi przypadkami, o których pisałem. zauważ, że niektóre z rzeczy, które napisałem, są opcjonalne (np. część "param.format", która sprawia, że ​​tło jest przezroczyste). nie krępuj się bawić z nimi. o efekcie rozmycia, nie jestem tego obeznany, ale na pewno możesz poszukać, jak to zrobić. –

+0

Dziękuję bardzo! Działa doskonale! –

10

i Jestem jednym z twórców pakietu Tooleap SDK i zajmowaliśmy się tym problemem. Zasadniczo nie trzeba używać wartości SYSTEM_ALERT_WINDOW, aby wyświetlać aktywność na innej. Możesz wyświetlić zwykłą "zmniejszoną" aktywność z przezroczystym tłem.

zrobić „złączowe aktywny zmień params układu okno aktywności wysokości i szerokości:

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

this.getWindow().setAttributes(params); 

Aby przezroczystym tłem dodać do definicji działalności w pliku manifestu:

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

W ten sposób można utworzyć iluzję operacji swobodnej:

Należy pamiętać, że tylko aktywność na pierwszym planie zostanie wznowiona, a pierwsza to pauza sed. Ale w przypadku większości aplikacji nie powinno to stanowić problemu.

Teraz pozostaje tylko, aby uruchomić aktywność pływającą.

Oto przykład "pływającej" aplikacji kalkulatora z regularną aktywnością. Zauważ, że aktywność pod kalkulatorem należy do innej aplikacji.

Tooleap Calculator Screenshot

+0

Oznacza to jednak, że wszystko, co robisz, polega na umieszczeniu działania na aktywności innej aplikacji, więc jeśli klikniesz przycisk Wstecz, wpłynie to na Twoją aktywność, a nie na osobę z tyłu. Aby stworzyć coś, co naprawdę pływa i nie poradzi sobie z tym, co powinno być obsługiwane, ta metoda nie zadziała ... –

+1

Wszystko zależy od rodzaju doświadczenia użytkownika, które próbujesz osiągnąć. Jeśli chcesz wyświetlić mały przycisk pływający, który nie zakłóca działania pod nim, to tak, to nie będzie dobre rozwiązanie. Ale jeśli chcesz wyświetlić mały ekran, na którym użytkownik musi się zająć, zanim przejdzie dalej do swojej pracy (coś w rodzaju okna dialogowego), to mała aktywność może być dobrym rozwiązaniem. – Danny

+1

hmmmm ... teraz, gdy ponownie przeczytałem pytanie, nie jest jasne, jakie dokładnie jest to potrzebne zachowanie. Więc masz rację. –