当手机进入待机状态时,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 中,您只需通过意图(使用意图中的参数启动服务)向您的服务发送消息,获取 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() 方法(在此处查看)。在与 AlarmManager 关联的 onReceive() 方法的所有执行过程中,Cpu 将保持开启状态。然后您需要锁定 cpu,启动现在确定执行的服务。同时 onReceive() 方法将停止,但您的服务可以确保正在执行。你唯一需要做的就是找到一个解决方法,让你的服务与你的 AlarmManager 通信,在服务执行后释放 cpu 锁,如 AlarmManager 的主页所述。也就是说,您只需要将服务与广播接收器同步,使用外部对象来保存所需的信息(在这种情况下,如果 cpu 在服务结束时锁定,则释放 cpu)。