2013-03-13 154 views
2

Android设备可以通过两种方式进入“睡眠”模式。一种是让屏幕超时并自动关闭。在这种情况下,目前还不清楚CPU是否仍在运行应用程序(除非它们具有部分唤醒锁定)。另一种情况是当您按下电源按钮并且屏幕熄灭时。我不清楚这是否与让屏幕超时一样。Android设备如何唤醒

但我真正想知道的是真正发生的事情。例如,如果我按下电源按钮但有电话进入,设备将会唤醒并点亮,手机应用程序启动。这只是手机应用程序与部分唤醒锁一起运行还是制造商使用自定义硬件功能来识别手机铃声并将其从睡眠模式中取出?

我感兴趣的原因是因为如果它是硬件控制的,出现的问题是是否有其他硬件相关的功能是以相同的方式控制的。例如,GPS接收器可以保持活动状态,但只有在收到有效位置时才唤醒设备?

为了节省电池消耗,如果我们可以在某些硬件功能被激活时唤醒设备,那就太好了。我对WakeLock功能的印象是,它只是一个软件功能,对电源按钮的支持很少。

回答

0

根据我的经验,电话和GPS等将播出Intents,您可以使用BroadcastReceiver来收听。该设备将清醒足够长时间来播放它们。 (从技术上说,Android固件可以处理设备的功率水平,并给予唤醒锁的某些功能,这给人的印象是硬件信号允许您的代码运行,但实际上硬件信号允许Android运行,这允许您的代码运行。)

因此,您将注册这些意图,并在BroadcastReceiver子类内通知。该设备将在您的接收器内短时间醒来,足以让您掌控并创建自己的WakeLock

所以:

  1. ,设备不那种有特点,你是后 - 尽管具体地说,它是由Android的固件,并不完全硬件控制。这意味着不同的固件版本可以做不同的事情。当观看不同设备上的GPS跟踪应用的调试日志输出时,这非常明显 - 观看固件GPS如何使用。

  2. 您可以挂钩Intent,并有时间实施自己的WakeLock

我会检查@ Commonsware的WakefulIntentService,并利用它。

否则他写在他的书中关于它的一些非常好的信息。我已删除了它的某些部分,但离开它这里要说明的 - 一个BroadcastReceiver我用来侦听来自LocationProvider

这是改编自生产代码示例代码更新的


例尽管没有任何特殊的代码,这个接收器仍然可以运行。

/** 
* 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); 
      } 
     } 
    } 
}; 
的我如何设置BroadcastReceiver获得GPS事件

这里


例子是我经常使用,以确保我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

为了让您在BroadcastReceiver中侦听意图,CPU必须运行,这意味着您必须使用部分唤醒锁定,否则如果设备超时或某人按下电源按钮,你的BroadcastReceiver是无用的。如果硬件功能(如GPS)可以在有数据的时候简单地打开CPU,然后发送它的意图,那将会很不错。我不确定,但我相信只有Wi-Fi和内置的电话。 – AndroidDev 2013-03-13 06:50:15

+0

这不是100%正确的。对于LocationProviders,您注册以接收Intent,即使设备“睡着”,您也会收到它。 – 2013-03-13 07:01:57

+0

这可能是因为Android会自动添加部分唤醒锁来处理位置提供程序,在这种情况下,设备根本没有睡着。它不仅需要接收位置,而且还可能对其执行软件处理(如检测接近度),它怎么会睡着呢。 – AndroidDev 2013-03-13 07:04:44