Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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
Java 如何从应用程序设置每天一次的通知_Java_Android_Android Service_Alarmmanager_Android Alarms - Fatal编程技术网

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的数据,并最终显示一个通知
出于测试目的,我将警报设置为+1分钟。。。但它不是那样工作的。也许我在概念上做错了什么

一些代码

AndroidManifest.xml

<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);
    }
}