Android - Как установить уведомление на определенную дату в будущем?
Edit: решено! Вы когда-нибудь хотели установить уведомление с определенной даты, начиная с определенного момента времени (когда запускается действие или когда нажата кнопка?) Подробнее узнать, как:
//Set a notification in 7 days
Calendar sevendayalarm = Calendar.getInstance();
sevendayalarm.add(Calendar.DATE, 7);
Intent intent = new Intent(this, Receiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 001, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, sevendayalarm.getTimeInMillis(), pendingIntent);
вот код для класса приемника
public class Receiver extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Intent intent = new Intent(this, Test.class);
long[] pattern = {0, 300, 0};
PendingIntent pi = PendingIntent.getActivity(this, 01234, intent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.depressiontest)
.setContentTitle("Take Questionnaire")
.setContentText("Take questionnaire for Duke Mood Study.")
.setVibrate(pattern)
.setAutoCancel(true);
mBuilder.setContentIntent(pi);
mBuilder.setDefaults(Notification.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(01234, mBuilder.build());
}
}
и не забудьте добавить следующие разрешения в манифест!
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<service android:name=".Receiver2" android:enabled="true">
<intent-filter> <action android:name="NOTIFICATION_SERVICE" /></intent-filter>
</service>
2 ответов
Не забудьте дать следующие разрешения манифеста
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
ваши регистрации широковещательного приемника будут такими
<receiver android:name=".AlarmReceiver" >
<intent-filter>
<action android:name="NOTIFICATION_SERVICE" />
</intent-filter>
</receiver>
важное замечание:
При регистрации широковещательного приемника с Intent-Filter
, вам необходимо добавить exported
атрибут и установите его в false. Вот так:
<service
android:name=".utility.AlarmReceiver" android:exported="false">
<intent-filter>
<action android:name="NOTIFICATION_SERVICE" />
</intent-filter>
</service>
другие компоненты других приложений смогут вызывать или взаимодействовать с вашим сервисом.
полное объяснение от Google:
android:exported
Specifies whether or not components of other applications
can invoke the service or interact with it —
"true" if they can, and "false" if not.
When the value is "false", only components of the same application or
applications with the same user ID can start the service or bind to it.
The default value depends on whether the service contains intent filters.
The absence of any filters means that it can be invoked only by specifying
its exact class name. This implies that the service is intended only for
application-internal use (since others would not know the class name). So
in this case, the default value is "false". On the other hand, the presence
of at least one filter implies that the service is intended for external
use, so the default value is "true".