警报不会唤醒我的服务

时间:2013-04-09 14:46:49

标签: android android-alarms android-pendingintent

我有以下代码,我希望无论手机的状态如何,此警报都会调用我的服务。即使它处于睡眠模式,我也需要它来访问互联网并进行一些网络呼叫。

为什么手机处于睡眠模式时不起作用?

警报管理器

        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();
            }
        }
    }

1 个答案:

答案 0 :(得分:6)

  

为什么手机处于睡眠模式时不起作用?

由于startService()是异步的,因此Android仅保证_WAKEUP警报会在onReceive()结束前让设备保持唤醒状态。您需要直接或通过using my WakefulIntentService使用WakeLock