0

我有一项服务(在 Manifest 文件中正确声明),它会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();
}

Manifest 文件中的服务声明:

<service
    android:name="com.xxxx.MyService"
    android:exported="true">
</service>
4

1 回答 1

3

首先,您BroadcastReceiver将在 结束后的纳秒内消失onDestroy(),使其无用。请使用元素BroadcastReceiver在清单中注册您的。<receiver>

其次,_WAKEUP警报只能使设备保持清醒足够长的时间来处理onReceive(). BroadcastReceiver您需要使用 aWakeLock使设备保持清醒的时间更长。根据你在做什么,我的WakefulIntentService可能会有一些用处。

第三,您不需要导出服务,这样做会打开潜在的安全漏洞。我建议删除android:exported="true".

于 2013-06-12T20:00:58.993 回答