我已经实现了一个调用服务的AlarmManager。问题是虽然我在AsyncTask中启动它,但它阻止了主线程。这是我的AsyncTask的来源:
private class NotificationsServiceTask extends AsyncTask<Void, Void, Void> {
private AlarmManager alarmMgr;
private PendingIntent pi;
@Override
protected Void doInBackground(Void... params) {
alarmMgr = (AlarmManager) LoginActivity.this.getSystemService(Context.ALARM_SERVICE);
Intent serviceIntent = new Intent(LoginActivity.this, Service.class);
pi = PendingIntent.getService(LoginActivity.this, 0, serviceIntent, 0);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 120000, pi);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
我需要异步执行,因为它阻止了我的主线程。
答案 0 :(得分:7)
在AsyncTask中设置警报无关紧要。警报管理器将始终在主线程上启动您的服务,因为这就是服务的工作方式。
要解决您的问题,您需要修改警报开始创建AsyncTask
以运行的服务。
答案 1 :(得分:0)
我知道不是链接农场,但Commonsguy写了WakeFullIntentService
他明确地使用警报接收器来覆盖它。效果很好,值得一试。这会将来自你的闹钟接收器的请求排队,在后台工作并唤醒设备,同时在一个单独的线程上运行。