Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计划在AlarmManager上运行的Android服务未启动_Android_Android Service_Android Alarms - Fatal编程技术网

计划在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位于前台,您将冻结它。“很抱歉,我还没有找到如何访问的方法