2017-12-28 19 views
0

기본적으로 내 응용 프로그램은 orientation landscape로 설정됩니다. 이것은 장치가 잠겨있을 때 문제가 발생합니다. 방향이 세로 방향 (잠긴 화면을 수용하기 위해)으로 변경되어 onResume이 강제로 호출되기 때문입니다. 이런 일이 발생하면 모든 객체가 null로되어 앱이 다운 될 수 있습니다. 나는 충돌을 막는 변화를 만들었고 앱은 'ok'를 작동시킨다. 잠금 화면에서 앱으로 돌아갈 때 30 초 동안 UI가 올바른 방향으로 스냅하기 전에 세로 방향으로 표시됩니다.전화 화면이 잠겨있을 때 onResume이 호출되는 것을 방지하거나 처리하는 방법은 무엇입니까?

해결할 작업

i. onResume에서 null이 될 수없는 모든 객체에 대해 null 검사를 추가했습니다.

ii. 목록에 android:configChanges="orientation|screenSize"이 추가되었습니다.

iii. 목록에 android:screenOrientation="landscape"을 추가했습니다.

잠금 화면에서 내 앱으로 부드럽게 전환 할 수있는 다른 방법으로는 깜박임, 깜박임 또는 방향 변경이 필요하지 않습니까?

답변

1

귀하의 문제에서 내가 이해할 수있는 것입니다. 앱 충돌로 이어지는 onResume()에있는 모든 개체의 null에 직면합니다. 그리고 onResume()이 다시 호출되는 것을 피할 수는 없습니다. 활동 라이프 사이클에서 예상되는 동작입니다. 그러나 트릭이 있습니다. onPause()에서 화면이 꺼졌다 켜져 있는지를 알 수있는 플래그를 만들면됩니다. 휴대 전화가 잠금 해제되면 onResume()으로 전화하여 해당 플래그를 관리 할 수 ​​있습니다.

boolean isScreenUnLock = false;   
@Override 
protected void onPause() { 
    super.onPause(); 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    isScreenUnLock = pm.isScreenOn();  
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(isScreenUnLock){ 
     //Do something 
    } 
} 

하지만 더 좋은 방법은 아닙니다. Activity null의 모든 객체를 피하는 대신 액티비티 상태를 처리하는 것이 좋습니다. 자세한 내용은 this 예제를 확인하십시오.

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    // Save UI state changes to the savedInstanceState. 
    // This bundle will be passed to onCreate if the process is 
    // killed and restarted. 
    savedInstanceState.putBoolean("MyBoolean", true); 
    savedInstanceState.putDouble("myDouble", 1.9); 
    savedInstanceState.putInt("MyInt", 1); 
    savedInstanceState.putString("MyString", "Welcome back to Android"); 
    // etc. 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore UI state from the savedInstanceState. 
    // This bundle has also been passed to onCreate. 
    boolean myBoolean = savedInstanceState.getBoolean("MyBoolean"); 
    double myDouble = savedInstanceState.getDouble("myDouble"); 
    int myInt = savedInstanceState.getInt("MyInt"); 
    String myString = savedInstanceState.getString("MyString"); 
} 

또는 위에있는 핸들 상태를 빠르게 수행 할 수 있습니다. 이 간단한 사용은 library입니다.

+0

아주 좋습니다! 이것은 아름답게 보이고 작동합니다. – portfoliobuilder

+0

듣기 좋은데. :) –