2013-04-09 76 views
2

我有以下代码,我希望这个闹钟可以调用我的服务,而不管手机的状态如何。即使它处于睡眠模式,我也需要它访问互联网并拨打一些网络电话。闹钟不会唤醒我的服务

为什么在手机处于睡眠模式时不工作?

报警管理

 Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, 5); 
     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent notifyintent = new Intent(this, OnAlarmReceiver.class); 
     notifyintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     notifyintent.setAction("android.intent.action.NOTIFY"); 
     PendingIntent notifysender = PendingIntent.getBroadcast(this, 0, notifyintent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20 * 1000, 
       notifysender); 

AlarmReceiver

public class OnAlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // PullPendingRequests.acquireStaticLock(context) 
     context.startService(new Intent(context, PullPendingRequests.class)); 
    } 
} 

PullPendingRequests,的PendingIntent

public class PullPendingRequests extends IntentService 

public PullPendingRequests() { 
     super("PullPendingRequests"); 
     me = this ; 
    } 

@Override 
    final protected void onHandleIntent(Intent intent) { 

     Location myLocation; 
     Log.d("Taxeeta:PullPendingRequets", "Started Location"); 
     if (God.locationManager == null) 
      God.locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     myLocation = God.locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if (myLocation != null) 
      onLocationChanged(myLocation); 
     else { 
      God.notifications.setSpeedNotification(); 
     } 

     Log.d("Taxeeta:PullPendingRequets", "Ended Location"); 
    } 

清单的权限和其他设置

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.READ_LOGS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> --> 
<service 
     android:name="com.taxeeta.PullPendingRequests" 
     android:enabled="true" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.Light.NoTitleBar" /> 

<receiver 
      android:name="com.taxeeta.support.OnAlarmReceiver" 
      android:exported="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.NOTIFY" /> 
      </intent-filter> 
     </receiver> 

编辑:宜这项工作,它不适合我?

public class PullPendingRequests extends IntentService implements LocationListener { 

    private static final String NAME = "com.commonsware.cwac.wakeful.WakefulIntentService"; 
    private static volatile PowerManager.WakeLock lockStatic = null; 
    private static PowerManager.WakeLock lock; 

    synchronized private static PowerManager.WakeLock getLock(Context context) { 
     if (lockStatic == null) { 
      PowerManager mgr = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 

      lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME); 
      lockStatic.setReferenceCounted(true); 
     } 

     return (lockStatic); 
    } 

    @Override 
    final protected void onHandleIntent(Intent intent) { 
     try { 
      lock = getLock(this.getApplicationContext()); 
      lock.acquire(); 
      Location myLocation; 
      Log.d("Taxeeta:PullPendingRequets", "Started Location"); 
      if (God.locationManager == null) 
       God.locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
      myLocation = God.locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      if (myLocation != null) 
       onLocationChanged(myLocation); 
      else { 
       God.notifications.setSpeedNotification(); 
      } 

      Log.d("Taxeeta:PullPendingRequets", "Ended Location"); 
     } finally { 
      if (lock.isHeld()) { 
       lock.release(); 
      } 
     } 
    } 

回答

6

为什么没有它,当手机处于睡眠模式下工作?

由于startService()是异步的,和Android只保证一个_WAKEUP报警将保持器件唤醒,直到onReceive()结束。您需要直接或通过using my WakefulIntentService使用WakeLock

+0

谢谢,你真棒!我刚刚添加了一个可能的修复程序,但它不起作用。我错过了什么 ? – Siddharth 2013-04-09 15:05:42

+1

@Siddharth:“我错过了什么?” - 是的。你不能等到'onHandleIntent()'获得锁定。这在'onReceive()'返回后很好地发生,并且设备可能会在此之前入睡。 – CommonsWare 2013-04-09 15:11:42

+0

这就是为什么你是专家,谢谢你。 – Siddharth 2013-04-10 03:06:33