2014-02-06 8 views
8

Ich verwende dies, um eine Sicherheitsfunktion zu implementieren, die einen Sperrbildschirm anzeigt, wenn meine App den Fokus wiedererlangt, nachdem sie von einer anderen App zurückgekommen ist.isApplicationBroughtToBackground Sicherheitsfeature führt oft zu Fehlverhalten

Jetzt ist das Problem, dass die Sicherheitsfunktion manchmal zweimal angezeigt wird. Nachdem ich ein wenig gegraben habe, ist mir aufgefallen, dass die topActivity von ActivityManager.getRunningTasks (1) manchmal immer noch die Aktivität ist, von der Sie gerade zurückgekommen sind.

In meinem Fall sind die störenden verweilenden Apps com.android.mms und com.google.android.apps.maps.

Ich habe auch eine Calling-Funktion innerhalb der Anwendung, aber es ist nicht schlecht benehmen.

Ich bin völlig verwirrt mit diesem Verhalten.

+0

Es ist nicht wirklich klar, was Ihre Frage ist. Ich kenne auch keine 'isApplicationBroughtToBackground()' Methode. Woher kommt das? – nicopico

Antwort

0

Dies ist wirklich ein problematischer Fall mit Android. Versuchen Sie folgendes, was für mich funktionierte:

Haben Sie eine Basisklasse für Ihre Aktivitäten. Darin:

@Override 
protected void onPause() { 
    Utils.wentInBackground(this); 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    Utils.wentInForeground(this); 
    super.onResume(); 
} 

Dann in einer statischen Dienstprogramme Klasse haben diese:

public static void wentInBackground(final Activity which) { 
    inBackground = true; 
    lastPaused = which.getClass().getSimpleName(); 

    final PowerManager powerManager = (PowerManager) which.getSystemService(POWER_SERVICE); 
    final boolean isScreenOn = powerManager.isScreenOn(); 

    if (isApplicationSentToBackground(which) || !isScreenOn) { 
     // Do your security lockdown here. 
    } 
} 


public static boolean isApplicationSentToBackground(final Context context) { 
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = am.getRunningTasks(1); 

    if (!tasks.isEmpty()) { 
     ComponentName topActivity = tasks.get(0).topActivity; 
     if (!topActivity.getPackageName().equals(context.getPackageName())) { 
      return true; 
     } 
    } 

    return false; 
} 


public static void wentInForeground(final Activity which) { 
    inBackground = false; 
    final String activityName = which.getClass().getSimpleName(); 

    if (lastPaused.equals(activityName) || !isLoggedIn()) { 

     if (isLoggedIn()) { 
      // Do your security lockdown here again, if necessary. 
     } 

     // Show your security screen or whatever you need to. 
    } 
} 

public static boolean isLoggedIn() { 
    return loggedIn; 
} 
+0

Hallo. Tut mir leid, dass ich so spät geantwortet habe. Ich möchte die Verwendung von isLoggedIn wissen. Würdest du bitte ausarbeiten? –

+0

Dies ist wahrscheinlich etwas für den Anwendungsfall. Sie haben möglicherweise eine andere Logik, um festzustellen, ob der Benutzer angemeldet ist oder nicht. Wenn Sie nicht denken, dass Sie das brauchen, lassen Sie es einfach fallen. – Stan