0

I am trying to set up a reminder feature. The user will input a time, hit a button, and a notification will be sent out at that time. However I cannot get the notification to fire at theexact time despite how I've switched up my code. Below is the code for my service, receiver, activity, and manifest. I have even tried .setWindow() but no matter what I try I'll usually get the notification within 5-10 minutes....If there is gonna be a delay it can be no larger than one minute if possible. Any help would be gratefully appreciated.

Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ocv.pushbeta">

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACTION_VIEW" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- App receives GCM messages. -->
<permission
    android:name="com.ocv.pushbeta.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.ocv.pushbeta.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name=".permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.CAMERA" />



<application
    android:allowBackup="true"
    android:icon="@drawable/blankappmainicon"
    android:label="Push Beta">

    <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="com.ocv.pushbeta" />
        </intent-filter>
    </receiver>
    <receiver android:name=".AlarmReceiver" />
    <service android:name=".GCMIntentService" />
    <service android:name=".AlarmService"
             android:enabled="true" />



    <activity
        android:name=".MenuActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".APITest"
        android:theme="@style/Theme.AppCompat.Light"/>

    <activity
        android:name=".SettingsActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.NoActionBar" />

    <activity android:name=".ReadTextFileActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.NoActionBar"/>

    <activity android:name=".PushActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.NoActionBar"/>
    <activity android:name=".AlarmActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.NoActionBar"/>

</application>

Activity

package com.ocv.pushbeta;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.ToggleButton;

import java.util.Calendar;

public class AlarmActivity extends Activity {

    AlarmManager alarmManager;
    private PendingIntent pendingIntent;
    private TimePicker alarmTimePicker;
    private static AlarmActivity inst;
    private TextView alarmTextView;

    public static AlarmActivity instance() {
        return inst;
    }

    @Override
    public void onStart() {
        super.onStart();
        inst = this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        alarmTimePicker = (TimePicker) findViewById(R.id.alarmTimePicker);
        alarmTextView = (TextView) findViewById(R.id.alarmText);
        ToggleButton alarmToggle = (ToggleButton) findViewById(R.id.alarmToggle);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    }

    public void onToggleClicked(View view) {
        if (((ToggleButton) view).isChecked()) {
            Log.d("MyActivity", "Alarm On");
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour());
            calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute());
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            Intent myIntent = new Intent(AlarmActivity.this, AlarmReceiver.class);

            pendingIntent = PendingIntent.getBroadcast(AlarmActivity.this, MenuActivity.GenID(), myIntent, 0);

            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
                Log.d("MyActivity", "SDK Higher than 19...setting exact");
                //alarmManager.setExact(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }else{
            Log.d("MyActivity", "SDK lower than 19...Alarm will be off");
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }

        } else {
            alarmManager.cancel(pendingIntent);
            setAlarmText("");
            Log.d("MyActivity", "Alarm Off");
        }
    }

    public void setAlarmText(String alarmText) {
        alarmTextView.setText(alarmText);
    }
}

Service

package com.ocv.pushbeta;

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import java.util.Calendar;
import java.util.Date;

public class AlarmService extends IntentService {
    private NotificationManager alarmNotificationManager;

    public AlarmService() {
        super("AlarmService");
    }

    @Override
    public void onHandleIntent(Intent intent) {
        sendNotification("Wake Up! Wake Up!");
    }

    private void sendNotification(String msg) {
        Log.d("AlarmService", "Preparing to send notification...: " + msg);
        alarmNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MenuActivity.class), 0);

        NotificationCompat.Builder alamNotificationBuilder = new NotificationCompat.Builder(
                this).setContentTitle("Alarm").setSmallIcon(R.drawable.ic_lock_black_24dp)
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg);




        alamNotificationBuilder.setContentIntent(contentIntent);
        alarmNotificationManager.notify(MenuActivity.GenID(), alamNotificationBuilder.build());
        Log.d("AlarmService", "Notification sent.");
    }
}

Receiver

package com.ocv.pushbeta;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.content.WakefulBroadcastReceiver;

public class AlarmReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(final Context context, Intent intent) {
        //this will update the UI with message
//        MenuActivity inst = MenuActivity.instance();
//        inst.setAlarmText("Alarm! Wake up! Wake up!");

        //this will sound the alarm tone
        //this will sound the alarm once, if you wish to
        //raise alarm in loop continuously then use MediaPlayer and setLooping(true)
//        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
//        if (alarmUri == null) {
//            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
//        }
//        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
//        ringtone.play();

        //this will send a notification message
        ComponentName comp = new ComponentName(context.getPackageName(),
                AlarmService.class.getName());
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

EDIT-Try to refrain from linking to other questions please. I have google searched this topic to heck and back and until I get the answer I will continue to google so chances are I have at least seen every Stack Overflow on the subject.

Asix Jin
  • 109
  • 1
  • 2
  • 14
  • this is well documented. see: http://stackoverflow.com/questions/24724859/alarmmanager-setexact-with-wakefulbroadcastreceiver-sometimes-not-exact – muratgu Apr 04 '16 at 22:07
  • I'm not sure what I am looking for on that page. I've already looked at those question/answers before asking this and nothing from that page worked for me. – Asix Jin Apr 05 '16 at 13:42
  • the point is setExact is not actually designed to be exact like you expect. – muratgu Apr 05 '16 at 18:12
  • So what's the difference between set and setExact and also ive never had my notifications come at the time ive scheduled. The person asking that question reported that at least most times his notifications came in at the time he set. – Asix Jin Apr 05 '16 at 19:15

0 Answers0