Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android - How to set a notification to a specific date in the future?

Edit: SOLVED! Ever wanted to set a notification from a specific date starting a certain point in time (when an activity is started or when a button is pressed?) Read more to find out how:

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

Here's the code for the Receiver class

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

And don't forget to add the below permissions in the manifest!

<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>
like image 508
eddielement Avatar asked Jan 19 '15 04:01

eddielement


2 Answers

One Important thing to note: When registering your broadcast receiver with an Intent-Filter, you need to add the exported attribute and set it to false. Like this:

<service

        android:name=".utility.AlarmReceiver" android:exported="false">
        <intent-filter>
            <action android:name="NOTIFICATION_SERVICE" />
        </intent-filter>

    </service>

Else components of other apps will be able to invoke or interact with your service.

Full explanation from 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".
like image 133
Ojonugwa Jude Ochalifu Avatar answered Oct 23 '22 02:10

Ojonugwa Jude Ochalifu


Don't forget to give the below manifest permissions

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Your broadcast receiver registrations would be like this

   <receiver android:name=".AlarmReceiver" >
         <intent-filter>
           <action android:name="NOTIFICATION_SERVICE" />
         </intent-filter>
     </receiver>
like image 25
King of Masses Avatar answered Oct 23 '22 01:10

King of Masses