计划在AlarmManager上运行的Android服务未启动
我有一个服务(在清单文件中正确声明),它在计划在AlarmManager上运行的Android服务未启动,android,android-service,android-alarms,Android,Android Service,Android Alarms,我有一个服务(在清单文件中正确声明),它在onDestroy()上通过AlarmManager计划自己在一分钟后再次启动。但是,即使onDestroy()运行正常,服务也不会启动。有什么不对劲吗 调度代码: @Override public void onDestroy() { BroadcastReceiver br = new BroadcastReceiver() { @Override public void onReceive(Context
onDestroy()
上通过AlarmManager
计划自己在一分钟后再次启动。但是,即使onDestroy()
运行正常,服务也不会启动。有什么不对劲吗
调度代码:
@Override
public void onDestroy() {
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent i) {
c.startService(new Intent(c, MyService.class));
}
};
registerReceiver(br, new IntentFilter("xxxx"));
PendingIntent pi = PendingIntent.getBroadcast(this, 0, new Intent("xxxx"), 0);
AlarmManager am = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + ONE_MINUTE, pi);
Log.i("onDestroy", "Service scheduled.");
unregisterReceiver(br);
super.onDestroy();
}
清单文件中的服务声明:
<service
android:name="com.xxxx.MyService"
android:exported="true">
</service>
首先,您的
广播接收器在onDestroy()
结束后几纳秒就消失了,这使得它毫无用处。请使用
元素在清单中注册您的广播接收器
其次,\u WAKEUP
警报只会让设备保持足够长的唤醒时间,以便在广播接收器中处理onReceive()
。您需要使用WakeLock
来延长设备的唤醒时间。这取决于你正在做什么,可能有一些用处
第三,您不需要导出服务,这样做会打开潜在的安全漏洞。我建议删除android:exported=“true”
首先,您的BroadcastReceiver
将在onDestroy()结束后的纳秒内消失,使其毫无用处。请使用
元素在清单中注册您的广播接收器
其次,\u WAKEUP
警报只会让设备保持足够长的唤醒时间,以便在广播接收器中处理onReceive()
。您需要使用WakeLock
来延长设备的唤醒时间。这取决于你正在做什么,可能有一些用处
第三,您不需要导出服务,这样做会打开潜在的安全漏洞。我建议删除android:exported=“true”
因为您在onDestroy中创建了接收器,它可能正在销毁接收器。因为您在onDestroy中创建了接收器,它可能正在销毁接收器。谢谢!注册我的广播接收器有那么重要吗?我必须在代码中实例化它,根据实例化点的不同,它可能距离实例销毁还有纳秒或更长的时间,所以将它从onDestroy()中移除不是更重要吗?第二,“取决于你在做什么”,我想你的意思是“取决于你的服务将运行多少秒”,这是由于10秒的唤醒锁定间隔,对吧?如果任务本身很重要,那就是:保持清醒30秒左右,获取GPS位置并将其发送到服务器。再次感谢@Piovezan:“注册我的广播接收器有那么重要吗?”——如果你想让它接收广播,是的。“我必须在代码中实例化它”——为什么?“由于10秒的尾流锁定间隙,对吧?”--我不知道你所说的“10秒尾流锁定间隙”是什么意思。释放唤醒锁后,设备可以在不到10秒内进入睡眠状态。“要保持清醒30秒左右,获取GPS位置并将其发送到服务器”--您可能需要检查LocationPoller
,然后:所谓“10秒唤醒锁定间隔”,我指的是onReceive()Android文档中所述的安卓.content.Intent),除非它们是不同的东西。如果我不必在代码中实例化我的BroadcastReceiver,很抱歉,我还没有找到如何访问它的实例。@Piovezan:“除非它们是不同的东西”--这是指花费在onReceive()
上的最长时间,与WakeLock
无关。实际上,如果您在onReceive()
中花费的时间超过几毫秒,那么如果您的UI位于前台,您将冻结它。“很抱歉,我还没有找到如何访问它的实例”--为什么需要访问它的实例?Android将创建一个实例并在其上调用onReceive()
,当广播Intent
与您的
匹配时。谢谢。我现在明白了。然而,我仍然不明白为什么我的BroadcastReceiver需要更长的唤醒锁来执行对startService()的几毫秒长的调用,该服务将持续一段不确定的时间,但显然是这样。谢谢!注册我的广播接收器有那么重要吗?我必须在代码中实例化它,根据实例化点的不同,它可能距离实例销毁还有纳秒或更长的时间,所以将它从onDestroy()中移除不是更重要吗?第二,“取决于你在做什么”,我想你的意思是“取决于你的服务将运行多少秒”,这是由于10秒的唤醒锁定间隔,对吧?如果任务本身很重要,那就是:保持清醒30秒左右,获取GPS位置并将其发送到服务器。再次感谢@Piovezan:“注册我的广播接收器有那么重要吗?”——如果你想让它接收广播,是的。“我必须在代码中实例化它”——为什么?“由于10秒的尾流锁定间隙,对吧?”--我不知道你所说的“10秒尾流锁定间隙”是什么意思。释放唤醒锁后,设备可以在不到10秒内进入睡眠状态。“要保持清醒30秒左右,获取GPS位置并将其发送到服务器”--您可能需要检查LocationPoller
,然后:所谓“10秒唤醒锁定间隔”,我指的是onReceive()Android文档中所述的安卓.content.Intent),除非它们是不同的东西。如果我不必在代码中实例化我的BroadcastReceiver,很抱歉,我还没有找到如何访问它的实例。@Piovezan:“除非它们是不同的东西”--这是指花费在onReceive()
上的最长时间,与WakeLock
无关。实际上,如果您在onReceive()
中花费的时间超过几毫秒,那么如果您的UI位于前台,您将冻结它。“很抱歉,我还没有找到如何访问的方法