當手機進入待機狀態時,CPU會停止工作,從而導致所有的進程停止其執行。 您可以通過使用PowerManager避免這種情況並鎖定CPU,以保證它將停留在即使當手機進入待機:
m_wakeLock = m_powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
m_wakeLock.acquire();
... cpu is assured to be on during this time ...
m_wakeLock.release();
但既然你需要的是有服務,喚醒每15分鐘,即使在待機狀態下,這可能會導致電池使用過度。 您可以通過使用AlarmManager來避免這種情況,該功能會每隔15分鐘安排一次事件,然後啓動相應的BroadcastReceiver。 在BroadcastReceiver中,您只需通過intent(通過intent啓動帶有參數的服務)向您的服務發送消息,獲取cpu,完成工作並釋放cpu。
-------------------------- UPDATE ------------------- ------
首先,聲明你的廣播接收器在您的清單:
<receiver
android:name="StartUpReceiver"
<intent-filter>
<action android:name="my.Package.MyEvent" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
你的廣播接收器將目光類似於此:
public class StartUpReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent();
serviceIntent.setAction("my.Package.MyService");
context.startService(serviceIntent);
}
}
這樣,每次使用例如sendBroadcast(意圖)方法()啓動具有動作「my.Package.MyEvent」的意圖),您的廣播接收器(即擴展BroadcastReceiver類CHECK HERE的類)將執行onReceive()方法。 在我的代碼中,我只需用適當的操作(「my.Package.MyService」)創建一個Intent,然後啓動MyService。
AlarmManager類只是簡單地爲您提供一種安排將來啓動的一些意向的方法,類似於sendBroadcast()方法(CHECK HERE)。 在與AlarmManager關聯的onReceive()方法的所有執行過程中,Cpu都將保持打開狀態。然後你需要鎖定CPU,啓動現在確定要執行的服務。與此同時,onReceive()方法將停止,但您的服務將確保執行。 您需要做的唯一事情就是找到一個解決方法,讓您的服務與您的AlarmManager進行通信,在服務執行後釋放CPU鎖,如AlarmManager的主頁所述。 也就是說,您只需要將您的服務與您的廣播接收器同步,即使用外部對象來保存所需的信息(在這種情況下,如果cpu在服務發佈cpu結束時被鎖定)。
當然,如果服務每15分鐘執行一次,那麼如果它確定沒有連接或無法及時得到響應,那麼您的服務應該進入休眠狀態並等待下一個15分鐘的喚醒打電話。 –
你爲什麼選擇不使用'AlarmManager'或'BroadcastReciever'? – gobernador