Search code examples
javaandroidservicealarmmanagerintentservice

IntentService which is started by AlarmManager doesn't work



I'm trying to get IntentService started by AlarmManager, but the service isn't started. (Obviously my service is defined in the manifest...)
Here's a little bit of code:

Starting the alarm service:

    Intent myIntent = new Intent(Main.this, TestsNotification.class);
    PendingIntent pendingIntent = PendingIntent.getService(Main.this, 0, myIntent, 0);
             AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
             Calendar calendar = Calendar.getInstance();
             calendar.setTimeInMillis(System.currentTimeMillis());
             calendar.set(Calendar.HOUR_OF_DAY, 15);
             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

Here's my IntentService:

public class TestsNotification extends IntentService {
    public TestsNotification() {
        super("myApp");
    }
    private SharedPreferences settings;
    private final String PREFERENCE_SETTINGS_FILENAME = "Settings";
    private int number=0;
    Tests tests;
@Override
public void onCreate() {
 // TODO Auto-generated method stub
    settings = getSharedPreferences(PREFERENCE_SETTINGS_FILENAME, MODE_PRIVATE);
    tests=new Tests();
}

@Override
public IBinder onBind(Intent intent) {
 // TODO Auto-generated method stub
 return null;
}

@Override
public void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
}

@Override
public void onStart(Intent intent, int startId) {
 // TODO Auto-generated method stub
 super.onStart(intent, startId);
}

@Override
public boolean onUnbind(Intent intent) {
 // TODO Auto-generated method stub
 return super.onUnbind(intent);
}
public void Notify(String title)
{
    NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Intent intent= new Intent (this,Splash.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
    String body = " בליך";
    //String title = "יש מחר מבחן!";
    Notification n =new Notification(R.drawable.test, body, System.currentTimeMillis());
    n.flags |=Notification.FLAG_AUTO_CANCEL;
    n.setLatestEventInfo(getApplicationContext(), title, body, pi);
    n.defaults = Notification.DEFAULT_ALL;
    number++;
    n.number=number;
    try {
    nm.notify(0,n);
    FileMethods FM = new FileMethods(this);
    Date current = new Date();
    FM.Write("LOG", "I Dont Care!",FM.Read("LOG", this, "") + current.getDay()+"/"+current.getMonth()+"/"+ current.getYear()+" "+current.getHours()+":"+current.getMinutes() + "Notified" + title+ "\n");
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    String Attribute = "Class";
    String info = settings.getString(Attribute, "none");
    if(!info.equals("none")) {
        String classLetter = info.substring(0, info.lastIndexOf(" "));
        String classNum1 = info.substring(info.lastIndexOf(" ")+1);
        int classNum = Integer.parseInt(classNum1);
        try {
            Tests nextTest = this.tests.GetTests(classLetter, classNum)[0];
            Date current = new Date();
            Date testDate = new GregorianCalendar(nextTest.getDate().getYear(), nextTest.getDate().getMonth(), Integer.parseInt(nextTest.getDate().getDay())).getTime();
            long difference = testDate.getTime()-current.getTime();
            if (difference <=86400000) {
                Notify("יש מחר מבחן!");
            }//SHOULDNT BE HARDCODED!!!
            else {
                Notify("אין מחר מבחן!!");
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
}

FileMethods is just a class to handle File reading and writing (to make sure the AlarmManager runs every 1 day)

Thank you!!


Solution

  • Since you are using set(), there is a 40% chance that you have now specified a time that is in the past.

    Also, if the device is asleep at the time, it may fall back asleep before your service is started. There is a very specific pattern for using _WAKEUP alarms successfully, involving a BroadcastReceiver and a WakeLock. My WakefulIntentService tries to handle some of this work for you.

    Also, onStart() has been deprecated for quite some and should not be implemented on an IntentService.