2013-08-11 12 views
9

Mam ikonę pływaka, która pozostaje na szczycie wszystkich czynności, ale gdy urządzenie zostanie zablokowane, znika, dopóki urządzenie się nie odblokuje.Wyświetlanie widoku przy użyciu menedżera okien na ekranie blokady

Inne znaczenie, chcę wyświetlić widok (FloatIcon) na ekranie blokady za pomocą menedżera okien z usługi.

To jest mój kod do tej pory.

public class FloatIcon extends Service { 

    private WindowManager windowManager; 
    private ImageView floatIcon; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     floatIcon = new ImageView(this); 
     floatIcon.setImageResource(R.drawable.ic_launcher); 
     floatIcon.setClickable(true); 
     floatIcon.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getBaseContext(), MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(intent); 
      } 
     }); 

     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.TOP | Gravity.LEFT; 
     params.x = 0; 
     params.y = 100; 

     windowManager.addView(floatIcon, params); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (floatIcon != null) 
      windowManager.removeView(floatIcon); 
    } 
} 

Nie mogłem uzyskać czegoś pożytecznego, kiedy to google.

+0

Rozwiązałeś ten problem? Jeśli tak, czy mógłbyś mi powiedzieć, jak to zrobiłeś? – TahaYusuf

Odpowiedz

8

Użyj WindowManager.LayoutParams.TYPE_SYSTEM_ERROR zamiast WindowManager.LayoutParams.TYPE_PHONE, aby rozwiązać problem. Dzięki temu widok będzie mógł słuchać zdarzeń dotykowych. Jednakże można użyć WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY też ale to przyzwyczajenie słuchać dotknąć wydarzenia

+0

Czy mógłbyś wyjaśnić, w jaki sposób rozwiązuje to problem? – Kmeixner

+0

@Kmeixner Jeśli użyjesz SYSTER_ERROR jako typ dla paragrafów menedżera okien, spowoduje to, że widok dodany z tymi parametrami pojawi się na ekranach blokad i wszystkich innych ekranach z działającymi wszystkimi zdarzeniami dotykowymi, jednak możesz również użyć SYSTEM_OVERLAY, aby widok był widoczny we wszystkich ekrany zawierające blokadę ekranu, ale nie będą miały żadnych zdarzeń dotykowych. –

+0

Chociaż działa to na prawie wszystkich urządzeniach, niestety testowałem na Samsung S3, gdzie nie działało. Ekran połączenia przychodzącego i ekran blokady nakładają się na widok, który dodawałem do WindowManagera. – milosmns

5

chociaż pytanie jest, pewne wyjaśnienie: - pomocą okna TYPE_PHONE z FLAG_SHOW_WHEN_LOCKED pokaże tylko na ekranie blokady Jeśli to okno to pełnoekranowy - odwiedź android reference, natomiast użycie typu okna TYPE_SYSTEM_ERROR nie powoduje ograniczenia całego ekranu, co rozwiązuje problem.

i jak poprosił @milosmns, obejście tego może być dodanie opóźnienia powiedzmy około 100ms, do kodu, który wyświetla okno na ekranie połączenia przychodzącego będzie działać jak urok.