2012-07-20 14 views
5

Zbudowałem niestandardową aplikację blokady ekranu, która korzysta z odbiornika i usługi do nasłuchu, gdy użytkownik włącza się lub wyłącza z ekranu i uruchamia moją aktywność. Działanie ma całkowicie zastąpić ekran blokady. Aby to zrobić, moja aplikacja powinna wyłączyć blokadę na Androidzie, aby moja aplikacja działała jak nowy ekran blokady.Problemy z blokadą Androida w niestandardowej aplikacji blokady ekranu

Zamiast tego, co dzieje się po pierwszym zainstalowaniu aplikacji, usługa uruchomiona po raz pierwszy wydaje się działać. a kiedy użytkownik po raz pierwszy wyłącza ekran swojego telefonu po jego ponownym włączeniu, wyświetla się aplikacja działająca na górze i może odblokować telefon z moją aplikacją. Ale potem raz w systemie Android, jeśli użytkownik naciśnie przycisk powrotu do domu po następnym wyłączeniu ekranu i ponownym włączeniu go zamiast przywracania do mojej aplikacji, zostanie przeniesiony do ekranu odblokowania zapasów, a moja aplikacja zostanie otwarta pod nim, kiedy powinien być na górze.

Oto mój kod:

Moje życzenie:

public class MyService extends Service { 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 

     super.onCreate(); 
     Log.d("MyService","Service STARTED"); 
     final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     final BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 
} 

Mój odbiornik transmisji:

public class ScreenReceiver extends BroadcastReceiver { 

public static ArrayList<String> runningApplications = new ArrayList<String>(); 
private Context ctext; 
public static boolean screenIsLocked; 
public static KeyguardManager keyguardManager; 
public static KeyguardLock lock; 

@Override 
public void onReceive(final Context context, final Intent intent) { 
    ctext = context; 
    keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE); 
    lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
    lock.disableKeyguard(); 


    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     screenIsLocked = true; 
     Log.d("ScreenReceiver", "False"); 

     Intent intenti = new Intent(); 
     intenti.setClass(context, starterActivity.class); 
     intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intenti); 


    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     screenIsLocked = false; 
     Log.d("ScreenReceiver", "True"); 

        Intent intenti = new Intent(); 
        intenti.setClass(context, starterActivity.class); 
        intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intenti); 
    } 
} 

Moja aktywność, która jest uruchamiana jest w zasadzie pusty pomocą jednego przycisku odblokowującego, który wywołuje finish(); po naciśnięciu.

+0

Może to wynikać z faktu, że aplikacja została usunięta .... czy problem występuje kolejno? – jaisonDavis

Odpowiedz

2

Próbowałem skompilować twój kod i otrzymałem ten sam błąd, o którym mówisz. Próbowałem go zmodyfikować, aby działał i wreszcie dostałem problem !!!

public class ScreenReceiver extends BroadcastReceiver { 

    public static ArrayList<String> runningApplications = new ArrayList<String>(); 
    private Context ctext; 
    public static boolean screenIsLocked; 
    public static KeyguardManager keyguardManager; 
    public static KeyguardLock lock; 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     ctext = context; 
     keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE); 
     lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
     lock.disableKeyguard(); 


     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      screenIsLocked = true; 
      Log.d("ScreenReceiver", "False"); 

      Intent intenti = new Intent(); 
      intenti.setClass(context, starterActivity.class); 
      intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(intenti); 


     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenIsLocked = false; 
      Log.d("ScreenReceiver", "True"); 

         Intent intenti = new Intent(); 
         intenti.setClass(context, starterActivity.class); 
         intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         context.startActivity(intenti); 
     } 
    } 

Dzięki tej zmianie klasy odbiornik transmisji udało mi się przezwyciężyć problem

spróbuj i powiedz mi czy jest jakiś problem.

EDYCJA: Myślę, że problem może tkwić w metodzie finish() .... Android niszczy aplikacje, gdy wymaga pamięci ... Myślę, że finish() może pomóc androidowi w niszczeniu aplikacji (i to może być przyczyną problem występuje losowo)

+1

Czy to nie działa tylko z poziomu mojej aplikacji, a nie z systemu operacyjnego Android? – Peter

+0

Przepraszam, że nie rozumiem, o czym myślisz "z systemu Android" – jaisonDavis

+0

Po prostu wypróbowałem, teraz nie od razu wróciłem do ekranu blokady, ale następnym razem, gdy odblokowuję urządzenie, nie trafia ono do mojej aplikacji przywołuje domyślny unlocker – Peter

4

Zachowanie logiki związanych z klawiaturą zależy od urządzenia. Dzieje się tak dlatego, że zrzuty ekranowe są często wykonywane na zamówienie przez producentów urządzeń (tj. Nie w magazynie), niektóre z nich przestrzegają logiki klawiatury, z której korzystasz, inne nie.

Również AFAIK nowszej sposób kontrolowania blokada jest użycie okna flagi:

// inside activity 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
     | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

To nie rozwiąże problemu mimo, urządzenia nadal mają swoje zdanie na ten temat.

E.g. z mojego doświadczenia wynika, że ​​Galaxy Nexus wyświetli okno aktywności powyżej keyguard, ale nie będzie go odrzucać (mogłoby się wydawać, że urządzenie marki Google powinno respektować flagę, eh), więc jeśli klikniesz przycisk Wstecz w swojej aktywności - otrzymasz standardowy ekran blokady --- podczas gdy HTC One X wydaje się obsługiwać część zwalniającą poprawnie: twoje okno aktywności spowoduje, że standardowa blokada ekranu zostanie odrzucona zgodnie z oczekiwaniami.

Nie znalazłem sposobu na wymuszenie prawidłowego zachowania wszystkich urządzeń. Interfejs API Androida nie umożliwia tworzenia niestandardowych ekranów blokady (przynajmniej nie w tej chwili). Spójrz na te w sklepie - wszystkie mają dokładnie ten sam problem, że nie są wystarczająco stabilne.

Jako Dianne Hackborn says in this Google Groups answer, wszystko, co możesz zrobić w tym zakresie, to włamanie, więc spodziewaj się, że od czasu do czasu się zepsuje.

Powiązane problemy