Reputation: 2724
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!!
Upvotes: 2
Views: 2243
Reputation: 17077
You override #onCreate()
in your IntentService without calling super.onCreate()
. Don't do that.
@Override
public void onCreate() {
super.onCreate();
settings = getSharedPreferences(PREFERENCE_SETTINGS_FILENAME, MODE_PRIVATE);
tests=new Tests();
}
The IntentService
base implementation does a lot of necessary setup in that method (such as initializing the executor & whatnot) required to actually call IntentService#onHandleIntent(Intent)
.
Upvotes: 0
Reputation: 1006584
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
.
Upvotes: 2