2

This is my first post and I am new to Android App development so please bear with me.

I have written (and use every day) a pretty good reminders App because all the others were either too complicated or too simple. It is also on the play store, although not easy to find, but thats another story.

While I am happy with the whole App the alarms which show a notification or sound an alarm do not always happen. If the alarm is soon then it will but more than say 2 hours from now it often gets missed. Using "adb shell dumpsys alarm" it looks as if they are being discarded?

I have googled for days and have tried so many things, from this forum too, but no luck so I thought I would post some code to see if anybody can please tell me were I am going wrong as it should work as far as I can see.

So here goes.

I use alarm manager to queue the pending intent to call my broadcast receiver which starts a service which starts an activity which creates a notification and optionally sounds an alarm.

I was skipping the service bit but after googling it seems I should use a service. And as mentioned, this works fine for alarms happening soon but not after a few hours or a day or more. Could be due to Doze mode or my app being stopped by Android?

I would really appreciate some help please as I am pulling my hair out!!

Thanks in advance.

Here is my manifest. Where I think the problem is?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wingwares.reminders">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <supports-screens
        android:anyDensity="true"
        android:normalScreens="true" />

    <application
        android:icon="@drawable/reminder2"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <receiver android:name=".WidgetProvider">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_info" />
        </receiver>

        <service
            android:name=".WidgetService"
            android:exported="false"
            android:permission="android.permission.BIND_REMOTEVIEWS" />

        <activity
            android:name=".AppPreferences" />

        <activity
            android:name=".ListActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateAlwaysHidden">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".RemActivity"
            android:label="@string/add_reminder"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan" />

        <service
            android:name=".AlarmService"
            android:enabled="true"
            android:exported="true" >
        </service>

        <receiver
            android:name=".AlarmReceiver"
            android:enabled="true"
            android:exported="true" >

            <intent-filter>
                <action android:name="SET_ALERT" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".AlarmDialog"
            android:theme="@style/AlarmDialog" />

    </application>

</manifest>

And my Alarm Manager from ListActivity

public void setAlert(Context context, boolean turnOn){

intent = new Intent(context, AlarmReceiver.class);

intent.putExtra("name", fullName());
intent.putExtra("notes", notes);
intent.putExtra("setalarm", setalarm);
intent.putExtra("millis", time.getMilliTime());
intent.putExtra("remId", remId);

pendingIntent = PendingIntent.getBroadcast(context, 8192 + remId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

alarmManager.cancel(pendingIntent);

if (turnOn) {
    alertTime = time.getMilliTime() - (warning * 60000);
    interval = getInterval();

    //set repeating alarmManager just once
    if (freq.equals(EVERY) && type.equals(FIXED) && date.equals(getOriginal()) && interval > 0) {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alertTime, interval, pendingIntent);
    } else {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent);
        }
    }
} else {
    setalarm = false;
}

}

My broadcast receiver

public class AlarmReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent newIntent = new Intent(context, AlarmService.class);

        //pass the extras on and show the dialog
        newIntent.putExtras(intent);

        startWakefulService(context, newIntent);

    }
}

My Service

public class AlarmService extends IntentService {

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

    @Override
    protected void onHandleIntent(Intent intent) {

        Intent newIntent = new Intent(this, AlarmDialog.class);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

        //pass the extras on and show the dialog
        newIntent.putExtras(intent);
        startActivity(newIntent);
        AlarmReceiver.completeWakefulIntent(newIntent);

    }
}

My Activity (the notification part)

public class AlarmDialog extends Activity
        implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener  {

    Bundle extras;

    int remId;
    String name, notes;
    Boolean setalarm;

    long alarmTime;
    MediaPlayer player;
    PendingIntent pendingIntent;
    SharedPreferences mPrefs;

    NotificationManager manager;
    Notification notification;

    static final int SNOOZE_BUTTON = -2;
    static final int DISMISS_BUTTON = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //create notification and alert box if alarmManager selected

        mPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

        extras = getIntent().getExtras();
        alarmTime = extras.getLong("millis");
        remId = extras.getInt("remId");
        name = extras.getString("name");
        notes = extras.getString("notes");
        setalarm = extras.getBoolean("setalarm");

        //notification first
        notification = new RemNotification(this, name).get();
        if (notification != null) {
            manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            manager.cancel(remId);
            manager.notify(remId, notification);
        }

}

Phil
  • 21
  • 2
  • Welcome to Stack Overflow. Please review [How do I ask a good question](https://stackoverflow.com/help/how-to-ask). Your question should include a clear ***concise*** outline of your specific coding-related issue, a summary of what you have already tried and the relevant code in a *[Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)*, so we have enough information to be able to help! – FluffyKitten Sep 22 '17 at 01:10
  • 1
    I have the same issues with my app. Did you find the reason? – 4ybaka Jan 14 '18 at 23:05
  • 1
    Hi baka. No never figured it out. Real pain. Would love to hear of any tips you may come upon. – Phil Jan 16 '18 at 06:06

0 Answers0