当手机进入待机状态时,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。
-------------- 更新 -------- -----
首先,在你的清单中声明你的广播接收器:
<receiver
android:name="StartUpReceiver"
<intent-filter>
<action android:name="my.Package.MyEvent" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
您的 BroadcastReceiver 将如下所示:
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(Intent) 方法 (CHECK HERE) 启动带有动作“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)。