2011-04-15 151 views
4

即时接收广播接收器的意图,然后我开始服务做更多的工作。现在如果设备是睡眠并且发生这种情况,我必须得到Wakelock(AlarmManger?),为什么我需要它? 如果设备在没有唤醒的情况下进入睡眠状态,我的服务将停止运行。广播接收器,服务和Wakelock

回答

5

现在如果设备是睡眠,这发生了什么,我必须得到Wakelock(AlarmManger?),为什么我需要它?

如果设备先睡着了,您将不会“收到广播接收方的意图”,因为设备处于睡眠状态。

我必须得到Wakelock(AlarmManger?),为什么我需要它?

除非要确保设备在完成某些工作时保持运行状态,否则不需要它。

如果设备在没有获得唤醒锁的情况下进入睡眠状态,我的服务将停止运行。

是的。

+0

对于第一部分,我的意思是我会收到来自C2DM的意图,我猜你可以在设备处于睡眠状态时收到它。然后我想运行一个服务,我想我必须让wakelock保持运行。这些假设是否正确? – Jimmy 2011-04-15 19:15:56

+0

@Fevos:“我的意思是我会收到C2DM的意图,我想你可以在设备睡着的时候收到它。” - 是的,C2DM通过无线数据(AFAIK)使用套接字连接,并且该连接上的传入数据包将简短*唤醒设备。 “然后我想运行一项服务,我想我必须让wakelock继续运行,这些假设是正确的吗?” - 是的,你会想要自己的'WakeLock'。只要确保完成后即可发布。 – CommonsWare 2011-04-15 19:20:41

+0

太棒了!谢谢。 – Jimmy 2011-04-15 19:26:35

0
public class WakeLockManager extends BroadcastReceiver { 

    private static WakeLock mWakeLock; 
    private String LCLT; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) { 
      Log.v("wakelock", "GOT THE wakelock INTENT"); 
      boolean on = intent.getExtras().getBoolean("on"); 
      if (mWakeLock == null) { 
       PowerManager pm = (PowerManager) context 
         .getSystemService(Context.POWER_SERVICE); 
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
         "Breeze WakeLock"); 
      } 
      if (on) { 
       if (!mWakeLock.isHeld()) { 
        mWakeLock.acquire(); 
        Log.v("wakelock", "acquiring wakelock"); 
       } 
      } else { 
       if (mWakeLock.isHeld()) { 
        Log.v("wakelock", "releasing wakelock"); 
        mWakeLock.release(); 
       } 
       mWakeLock = null; 
      } 
     } 
    } 
} 

看看上面的代码..put在一个单独的类文件,并在您的清单中定义它的一些自定义的意图....现在,这个类将一个自定义的意图回应...只是播出的意图,你可以在你的整个应用程序打开激活锁定或关闭,因为激活锁定是static..like这样的:

public void setWakeup(boolean status) { 
    Intent wakelock_Intent = new Intent(CUSTOM_INTENT); 
    wakelock_Intent.putExtra("on", status); 
    this.sendBroadcast(wakelock_Intent); 
} 

以上将被定义在alarmmanager代码,以便它安排一个电话

+0

你确定这个“静态锁定“将不会在Receiver'class'卸载时被擦除?请参阅:http://stackoverflow.com/questions/6299283/broadcastreciever-life-cycle-static-variables#comment7376537_6299862 – 2013-04-25 15:03:25

+0

我假设该对象不会被垃圾收集,因为这不是一个匿名的broadcastReceiver。如果我自己分配这个对象并保持对它的一个硬引用,为什么它会被系统释放?这是一个有趣的话题,请指教。 – j2emanue 2013-04-26 20:32:10

1

看起来像Android的本地WakefulBroadcastReceiver将是一个完美的解决方案。需要在“清醒”的方式,而扩大这种比普通广播接收器并开始在的onReceive(服务)

startWakefulService(context, service); 

,并显示你的工作是在服务的onHandleIntent()完成 ,打电话

MyWakefulReceiver.completeWakefulIntent(intent);