2013-03-13 3 views
2

안드로이드 장치가 "절전"모드로 들어갈 수있는 두 가지 방법이 있습니다. 하나는 화면을 타임 아웃시키고 자동으로 꺼집니다. 이 경우 CPU가 앱을 계속 실행하고 있는지 여부는 분명하지 않습니다 (물론 부분적인 절전 모드 잠금 기능이있는 경우는 제외). 다른 경우는 전원 단추를 누르고 화면이 꺼지는 경우입니다. 화면이 그냥 시간 초과되는 것과 같은지 여부는 분명하지 않습니다.안드로이드 장치가 깨어나는 방법

하지만 실제로 알고 자하는 것은 실제로 일어나고있는 일입니다. 예를 들어 전원 버튼을 누르고 전화가 오면 기기가 깨어서 켜지고 전화 앱이 시작됩니다. 이것은 부분 웨이크 잠금 장치로 실행되는 전화 앱 일 뿐이며 제조업체가 전화 벨소리를 인식하고 절전 모드에서 꺼내는 데 필요한 사용자 정의 하드웨어 기능을 사용합니까?

하드웨어가 제어되는 경우 발생하는 질문은 같은 방식으로 제어되는 다른 하드웨어 관련 기능이 있는지 여부 때문입니다. 예를 들어, GPS 수신기가 살아있을 수 있지만 올바른 위치를 수신했을 때 장치를 깨울 수 있습니까?

배터리 소모량을 줄이려면 특정 하드웨어 기능이 활성화되었을 때 장치를 깨울 수 있으면 좋을 것입니다. WakeLock 기능에 대한 저의 인상은 전원 버튼에 대한 최소한의 지원 만이있는 소프트웨어 기능이라는 것입니다.

답변

0

내 경험에 의하면, 전화 및 GPS 등 IntentsBroadcastReceiver으로들을 수 있습니다. 장치는 방송 할 수있을 정도로 오래 깨어 있습니다.

(기술적으로 안드로이드 펌웨어는 장치의 전원 수준을 처리하고 특정 기능에 wakelocks를 제공합니다. 하드웨어 신호가 코드를 실행할 수 있다는 인상을 주지만 하드웨어 신호로 인해 Android를 실행할 수 있습니다. 귀하의 코드를 실행하십시오.)

따라서 이러한 의도로 등록하고 BroadcastReceiver 하위 클래스에 통지하십시오. 기기는 수신기 내부에서 잠시 동안 깨어날 수 있습니다. 오랫동안 제어 할 수 있고 자신의 WakeLock을 만들 수 있습니다.

그래서 :

  1. 장치는 종류의 당신을 쫓고 해당 기능을 가지고 않습니다 - 구체적으로는 안드로이드 펌웨어, 전적으로 하드웨어에 의해 제어되어 있지만. 이것은 다른 펌웨어 릴리스가 상황을 다르게 할 수 있음을 의미합니다. 이것은 다른 장치에서 GPS 추적 응용 프로그램의 디버그 로그 출력을 볼 때 - 펌웨어 GPS가 어떻게 사용되고 있는지를 볼 때 매우 분명합니다.

  2. Intent을 연결할 수 있으며 자신의 WakeLock을 구현할 시간이 있습니다.

@ Commonsware의 WakefulIntentService를 확인하고이를 사용합니다. https://github.com/commonsguy/cwac-wakeful

  • 그렇지 않으면 그는 그의 책에서 그것에 대해 아주 좋은 정보를 작성했습니다.나는 그것의 일부를 제거했지만 것을 보여주기 위해 여기두고 -이 생산 코드에서 적응 샘플 코드가있는 LocationProvider

    에서 업데이트를 수신하는 데 사용하는 BroadcastReceiver


    예 이 수신기는 특별한 코드가 없어도 작동 할 것입니다.

    /** * Receives broadcasts from the {@link LocationProvider}s. The providers * hold a {@link PowerManager.WakeLock} while this code executes. The * {@link MyService} code needs to also hold a WakeLock for code that * is executed outside of this BroadcastReceiver. */ private BroadcastReceiver locationEventReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // get location info Bundle extras = intent.getExtras(); if (extras != null) { Log.d("mobiRic", "LOCATION RECEIVER CALLBACK"); // check if this is a new location Location location = (Location) extras .get(android.location.LocationManager.KEY_LOCATION_CHANGED); Log.d("mobiRic", " - intent = [" + intent + "]"); Log.d("mobiRic", " - location = [" + location + "]"); if (location != null) { updateCurrentLocation(location, false); } } } }; 
    나는 GPS 이벤트 여기

    를 얻기 위해 BroadcastReceiver을 설정하는 방법의


    내가 Service이 위치 이벤트를 가져옵니다 내 확인하기 위해 사용 2 (편집) 방법이 있습니다. 당신이 브로드 캐스트 리시버의 의도를 수신하기 위해서는

    /** 
    * Starts listening for {@link LocationManager#GPS_PROVIDER} location 
    * updates. 
    */ 
    void doStartLocationListeningGps() 
    { 
        Intent intent = new Intent("MY_INTENT_GPS"); 
        PendingIntent pendingIntentGps = PendingIntent.getBroadcast(getApplicationContext(), 
         action.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    
        getLocationManager().requestLocationUpdates(LocationManager.GPS_PROVIDER, 
         LOCATION_UPDATE_TIME_GPS, 0, pendingIntentGps); 
    } 
    
    
    /** 
    * Registers the {@link #locationEventReceiver} to receive location events. 
    */ 
    void registerLocationReceiver() 
    { 
        IntentFilter filter = new IntentFilter(); 
    
        /* CUSTOM INTENTS */ 
        filter.addAction("MY_INTENT_GPS"); 
        registerReceiver(locationEventReceiver, filter); 
    } 
    
+0

는, CPU가, 어떤 당신이 부분 웨이크 잠금을 사용했습니다했다는 것을 의미 실행되어야한다, 그렇지 않으면 장치 시간이 초과하는 경우 또는 누군가가 전원 버튼을 누르면, 귀하의 BroadcastReceiver는 쓸모가 없습니다. 하드웨어 기능 (GPS와 같은)이 데이터를 가지고있는 순간 CPU를 켜고 그 의도를 전송할 수 있다면 좋을 것입니다. 확실하지는 않지만 Wi-Fi와 전화에만 내장되어 있다고 생각합니다. – AndroidDev

+0

100 % 정확하지 않습니다. LocationProviders의 경우 인 텐트를 받기 위해 등록하고 장치가 "잠든"경우에도 가져옵니다. –

+0

아마 Android가 부분 웨이크 잠금 장치를 자동으로 추가하여 위치 제공 업체를 처리하기 때문입니다.이 경우 장치가 전혀 잠 들어 있지 않습니다. 위치를 수신 할 필요가있을뿐만 아니라 (근접 감지와 같이) 소프트웨어 처리를 수행해야 할 때 어떻게 잠들 수 있습니다. – AndroidDev