2017-08-10 76 views
0

我有MainActivity和onResume方法,我調用模式鎖定來創建並確認用戶身份。用戶訪問並離開這MainActivity來回,而活動在應用程序以及當手機在睡眠模式和用戶解鎖它。這兩種情況都會調用onRestart,onStart和onResume方法,但我只想撤銷解鎖方案中的模式。解鎖手機時顯示應用程序鎖定模式對話框

handlePattern()方法需要一個適當的區別來調用。

如何區分這一點,當我調用handlePattern方法?

MainActivity.class

onCreate(){} 

onResume(){ 
    //help needed to know that user is just visiting activity in app back and forth 
    or came back after unlocking the screen. 
    if(isPatternCallRequired){ 
     handlePattern() 
    } 
} 
+0

任何指導爲什麼downvoted ?? –

回答

1

在你的onStop()方法調用,您可以檢查,如果玩家處於睡眠模式和緩存布爾值。

PowerManager pm = (PowerManager) 
_context.getSystemService(Context.POWER_SERVICE); 
boolean isInSleepMode = !pm.isScreenOn(); 

檢查內部版本

if(Build.VERSION.SDK_INT >= 20) 
    // use isInteractive() 
else 
    // use isScreenOn() 

在onRestart當你從睡眠狀態恢復後調用 - 基於緩存的值可以顯示圖案解鎖。

完成使用後,您可能需要重置緩存的值。

onResume可能不是正確的API調用,因爲即使在您的活動加載時它也會被調用。根據您的評論

+0

嗯..我看到'isScreenOn'折舊和其他方法,如'powerManager.isInteractive(); powerManager.isDeviceIdleMode()'需要api級別20,我只能使用16級。有更好的解決方案嗎? –

+0

如果您需要同時支持這兩種版本,您可以隨時檢查構建版本。直到你的目標版本大於20,這兩個API都可以正常工作。 – Swati

+0

謝謝你..它運作良好.. –

0

編輯答案你可以嘗試ActivityLifecycleCallbacks太喜歡這個,

首先,註冊應用程序在你的應用程序類。

public class StackApp extends Application { 

    private static final String TAG = StackApp.class.getSimpleName(); 

    public static final String INTENT_ACTION_APP_STATE_CHANGE = "intent_action_app_state_change"; 
    public static final String INTENT_DATA_IS_IN_BACKGROUND = "intent_data_is_in_background"; 

    private static int mNumRunningActivities = 0; 

    private static AtomicBoolean mIsAppInForeground = new AtomicBoolean(); 

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

     if (Build.VERSION.SDK_INT >= 14) { 

      // registerActivityLifecycleCallbacks is supported only from the SDK version 14. 
      registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { 
       @Override 
       public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 

       } 

       @Override 
       public void onActivityStarted(Activity activity) { 
        mNumRunningActivities++; 

        if (mNumRunningActivities == 1) { 
         notifyAppState(false); 

         Log.i(TAG, "APP IN FOREGROUND"); 
        } 
       } 

       @Override 
       public void onActivityResumed(Activity activity) { 

       } 

       @Override 
       public void onActivityPaused(Activity activity) { 

       } 

       @Override 
       public void onActivityStopped(Activity activity) { 
        mNumRunningActivities--; 

        if (mNumRunningActivities == 0) { 

         notifyAppState(true); 


        } 
       } 

       @Override 
       public void onActivitySaveInstanceState(Activity activity, Bundle outState) { 

       } 

       @Override 
       public void onActivityDestroyed(Activity activity) { 

       } 
      }); 
     } 
    } 

    /** 
    * To notify App state whether its in ForeGround or in Background 
    * 
    * @param isInBackground 
    */ 
    private void notifyAppState(boolean isInBackground) { 
     if (isInBackground) { 
      mIsAppInForeground.set(false); 
     } else { 
      mIsAppInForeground.set(true); 
     } 

     sendAppStateChangeBroadcast(isInBackground); 
    } 

    public static boolean isInForeground() { 
     return mIsAppInForeground.get(); 
    } 

    private void sendAppStateChangeBroadcast(boolean isInBackground) { 

     Log.i(TAG, "sendAppStateChangeBroadcast - isInBackground : " + isInBackground); 

     Intent intent = new Intent(); 
     intent.setAction(INTENT_ACTION_APP_STATE_CHANGE); 

     intent.putExtra(INTENT_DATA_IS_IN_BACKGROUND, isInBackground); 

     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
    } 

} 

,並註冊了廣播和監聽應用程序是否會背景或前景這樣的樣品活動範例

public class SampleMyActivity extends AppCompatActivity { 

    private OnAppStateReceiver mAppStateReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sample_my); 

     mAppStateReceiver = new OnAppStateReceiver(); 

     IntentFilter filter = new IntentFilter(StackApp.INTENT_ACTION_APP_STATE_CHANGE); 
     LocalBroadcastManager.getInstance(this).registerReceiver(mAppStateReceiver, filter); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     if (mAppStateReceiver != null) { 
      LocalBroadcastManager.getInstance(this).unregisterReceiver(mAppStateReceiver); 
     } 
    } 

    private class OnAppStateReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (!TextUtils.isEmpty(action) && StackApp.INTENT_ACTION_APP_STATE_CHANGE.equalsIgnoreCase(action)) { 
       boolean isGoingBackground = intent.getBooleanExtra(StackApp.INTENT_DATA_IS_IN_BACKGROUND, false); 

       if (isGoingBackground) { 
        //Your app is not vissible to the use 
       } else { 
        // App is visible to the user. 
       } 
      } 
     } 
    } 
} 

注意:如果你想在多個活動傾聽您可以創建一個基地 類,並添加偵聽器在那裏,你可以做的操作,在那 的情況下,你可以減少很多代碼。

相關問題