根据这些示例:here和here,我试图创建定期启动的服务。
首先我创建了服务:
public class MonitorService extends IntentService {
private static final String TAG = "MonitorService";
public MonitorService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d("TAG", "Service method was fired.");
}
}
接下来,我创建了接收器:
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "MyReceiver on receive");
Intent i = new Intent(context, MonitorService.class);
context.startService(i);
}
}
我在 MainActivity :
中添加了此方法public void scheduleAlarm() {
Intent intent = new Intent(getApplicationContext(), MyReceiver.class);
final PendingIntent pIntent = PendingIntent.getBroadcast(this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
long firstMillis = System.currentTimeMillis();
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
// 1s is only for testing
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 1000, pIntent);
}
当然是在onCreate
方法中调用。
我并没有忘记更改 AndroidManifest :
<receiver
android:name=".MyReceiver"
android:process=":remote" >
</receiver>
<service
android:name=".MonitorService"
android:exported="false" />
不幸的是,结果是我的日志中没有任何反应。
所以我有两个问题。
问题
scheduleAlarm
方法添加到onCreate
,那么每次启动我的应用程序时都会调用它,仅在第一次启动应用程序时启动此方法的最佳方法是什么?修改
根据@Lasse的提示,我开始调试,并意识到Log.d无法正常工作,当我将其更改为Log.i时,会记录来自MonitorService的信息。
但是......调试并没有停止在MyReceiver的断点上,并且将Log.d更改为Log.i没有帮助。当然MonitorService正在解雇,这很奇怪。
此外,1000分钟的时间会导致每分钟点火服务,也许是最短时间,现在更改为AlarmManager.INTERVAL并不重要。
编辑2
最后我从服务和接收器获取日志。我曾尝试过很多次,然后才开始工作,但我不知道为什么。 但随之而来的是另一个问题 - 我的服务正在运行时我收到警告
W/art: Suspending all threads took: 21.787ms
我认为Service正在运行后台,所以无论多长时间都没关系,我应该关注这个警告吗?
答案 0 :(得分:1)
<强>被修改强>
关于第一个问题: 请参阅developer website
setInexactRepeating(), you have to use one of the AlarmManager interval constants--in this case, AlarmManager.INTERVAL_DAY.
所以改变你的1000使用constans
关于您的其他问题,您可以覆盖应用程序对象并在那里启动它。这样,只有在启动应用程序时才会调用它。