Java 如何从应用程序设置每天一次的通知
我有一个关于从我的应用程序中设置每日数据检查的一般性问题(当某些事件发生时发出通知) 我目前的做法是:Java 如何从应用程序设置每天一次的通知,java,android,android-service,alarmmanager,android-alarms,Java,Android,Android Service,Alarmmanager,Android Alarms,我有一个关于从我的应用程序中设置每日数据检查的一般性问题(当某些事件发生时发出通知) 我目前的做法是: 从应用程序(onCreate)我启动了一项服务 在检查是否已经有匹配的PendingEvent(在这种情况下我没有)之后,我使用AlarmManager在服务中设置了一个警报 (需要设置新的警报) 该服务检查来自SharedReferences的数据,并最终显示一个通知 出于测试目的,我将警报设置为+1分钟。。。但它不是那样工作的。也许我在概念上做错了什么 一些代码 AndroidMani
- 从应用程序(onCreate)我启动了一项服务
- 在检查是否已经有匹配的PendingEvent(在这种情况下我没有)之后,我使用AlarmManager在服务中设置了一个警报 (需要设置新的警报)
- 该服务检查来自SharedReferences的数据,并最终显示一个通知
<application
<activity
android:name=".OverviewActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="xxxxx.CheckDaysMonths" >
</service>
</application>
在主活动中(OverviewActivity.java)
编辑:将服务调用从隐式更改为显式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
startService(new Intent(this, CheckDaysMonths.class));
// additional stuff happening on the activity of my app goes here:
...
}
AlarmHelper.java
public class AlarmHelper {
public static PendingIntent getPendingIntentFromAlarm(Context context, int alarmId, String declaredAction) {
return (PendingIntent.getService(context, alarmId,
new Intent(declaredAction),
PendingIntent.FLAG_NO_CREATE));
}
public static void setAlarm(Context context, int alarmId, String declaredAction, int hourOfDay) {
Intent serviceIntent = new Intent(declaredAction);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
// How long until tomorrow to its hourOfDay?
//DateTime tomorrow = (new DateTime()).plusDays(1);
//DateTime tomorrowAtHourOfDay = new DateTime(tomorrow.getYear(), tomorrow.getMonthOfYear(), tomorrow.getDayOfMonth(), hourOfDay, 0);
DateTime tomorrowAtHourOfDay = (new DateTime()).plusHours(3);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, tomorrowAtHourOfDay.getMillis(), pi);
}
}
我通过引入另一个“中间层”服务解决了这个问题 所以现在我有了
- 正在启动服务1的应用程序GUI
- 服务1将检查是否已经有具有正确特征码的警报正在运行。如果没有,它将启动警报
- 警报将在凌晨2点发出,并启动服务2
- 服务2将检查数据(SharedReferences)并最终发送通知。然后它会再次启动警报
- 引导的广播接收器启动服务2
这很有效你说的“它没有那样工作”是什么意思?警报似乎没有响。。。我在调试模式下设置了一个断点,在预期的警报超时过期后,它没有进入服务的“onCreate”。我不确定该建议什么。您省略了一些相关内容,服务中的
AlarmHelper.setAlarm()
调用与类中的签名不匹配,您的描述与代码不太匹配,等等。您的服务是否在从活动的onCreate()调用时启动?我不这么认为,因为您使用的是隐式意图,但是清单中的
元素没有过滤器。还有,棒棒糖是不允许的,我想是的。服务需要以明确的意图启动;i、 例如,指定服务类的意图。嗯,好的,我明白了。因此,我将服务意图(在OverviewActivity.java中)从隐式更改为显式新意图(这是CheckDaysMonths.class)
,效果很好,但我似乎无法将serviceIntent(在CheckDaysMonths.java中)更改为显式,因为似乎只有在之前隐式设置的情况下才能检测设置的报警。“似乎只有在之前隐式设置的情况下才有办法检测设置的报警“-我认为这不对。只要您的alarmId
和serviceIntent
与创建PendingEvent时完全相同,它也应该适用于明确的意图。事实上,我刚刚测试了它,它对我来说就像预期的那样工作。
public class AlarmHelper {
public static PendingIntent getPendingIntentFromAlarm(Context context, int alarmId, String declaredAction) {
return (PendingIntent.getService(context, alarmId,
new Intent(declaredAction),
PendingIntent.FLAG_NO_CREATE));
}
public static void setAlarm(Context context, int alarmId, String declaredAction, int hourOfDay) {
Intent serviceIntent = new Intent(declaredAction);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
// How long until tomorrow to its hourOfDay?
//DateTime tomorrow = (new DateTime()).plusDays(1);
//DateTime tomorrowAtHourOfDay = new DateTime(tomorrow.getYear(), tomorrow.getMonthOfYear(), tomorrow.getDayOfMonth(), hourOfDay, 0);
DateTime tomorrowAtHourOfDay = (new DateTime()).plusHours(3);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, tomorrowAtHourOfDay.getMillis(), pi);
}
}