가끔 디버그를 위해 문제가 발생하는 함수를 누가 호출했는지 알고 싶을 때가 있다.

그럴 땐 아래 함수를 호출하면 Log로 Stack을 알 수 있다. (Exception 이용)

 

  1: public static void occurException(String tag) {
  2:     new IllegalArgumentException(tag).printStackTrace();
  3: }
  4: 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by HLDEC

CPU 및 Display의 Wake Lock을 쉽게 컨트롤 하는 방법은 아래와 같다.
사용하기 전에 initWakeLock으로 초기화를 해주고
acquireWakeLock/releaseWakeLock 으로 잠금/해제를 해주면 된다.
다 사용하고 나면 destroyWakeLock으로 최종 해제를 해주도록 한다.

WakeLock 으로 컨트롤 할 수 있는 옵션은 아래 표를 참조하자.

Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright

<!-- androidmanifest.xml -->
<user-permission android:name="android.permission.WAKE_LOCK"></user-permission>

// wake lock
private static WakeLock sWakeLock = null;
    
public static void initWakeLock(Context context) {
    // Lock CPU Sleep
    PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, context.getClass().getName());
    sWakeLock.setReferenceCounted(false);
}
    
public static void destroyWakeLock() {
    if (sWakeLock != null) {
        sWakeLock.release();
        sWakeLock = null;
    }
}
    
public static void acquireWakeLock(long timeout) {
    if (sWakeLock != null) sWakeLock.acquire(timeout);
}

 public static void acquireWakeLock() {
    if (sWakeLock != null) sWakeLock.acquire();
}
    
public static void releaseWakeLock() {
    if (sWakeLock != null) sWakeLock.release();
}
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by HLDEC

디바이스의 스크린이 켜졌는지 확인하는 방법은 아래와 같다.

// check screen status
public static boolean isScreenOn(Context context) {
     PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
     return pm.isScreenOn();
}
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by HLDEC
TAG Android

아래 함수를 사용하면 자바 및 네이티브 힙의 크기 및 사용량을 체크할 수 있다.
DDMS에서 체크 가능한 Java Heap에는 문제가 없는데도 불구하고
OutOfMemoryError가 발생하면 이 함수를 이용해 Heap사용량을 먼저 체크하자.

// for check heap size
    public static void logHeap(Class clazz) {
     final int MEMORY_BUFFER_LIMIT_FOR_RESTART = 15;
        Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/new Double((1048576));
        Double available = new Double(Debug.getNativeHeapSize())/new Double((1048576));
        Double free = new Double(Debug.getNativeHeapFreeSize())/new Double((1048576));
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);
    
        Log.d("CWMusicPlayerUtil", "debug. =================================");
        Log.d("CWMusicPlayerUtil", "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.asktingting.android.","") + "]");
        Log.d("CWMusicPlayerUtil", "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576)) +"MB free)");
        System.gc();
    
        // don't need to add the following lines, it's just an app specific handling in my app
        /*
        if (allocated>=(new Double(Runtime.getRuntime().maxMemory())/new Double((1048576))-MEMORY_BUFFER_LIMIT_FOR_RESTART)) {
            android.os.Process.killProcess(android.os.Process.myPid());
        }
        */
    }
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by HLDEC
TAG Android