2012-03-03 132 views
2


我想通过AlarmManager启动IntentService,但服务未启动。 (显然,我的服务是在清单中定义...)
这里的代码一点点:由AlarmManager启动的IntentService不起作用

启动报警服务:

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

这里是我的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只是一个类来处理文件读取和写入(以确保AlarmManager每隔1天运行一次)

谢谢!

回答

2

由于您使用的是set(),因此现在有40%的机会指定了过去的时间。

此外,如果设备当时睡着了,它可能会在服务启动之前回睡。对于成功使用_WAKEUP报警有一个非常具体的模式,涉及BroadcastReceiverWakeLock。我的WakefulIntentService试图为你处理这些工作。

此外,onStart()已被弃用相当一些,不应该在IntentService实施。

0

您在覆盖IntentService 没有调用super.onCreate()。不要这样做。

@Override 
public void onCreate() { 
    super.onCreate(); 
    settings = getSharedPreferences(PREFERENCE_SETTINGS_FILENAME, MODE_PRIVATE); 
    tests=new Tests(); 
} 

IntentService的基本实现不会给实际调用IntentService#onHandleIntent(Intent)需要大量的在该方法中必要的设置(如初始化执行人&诸如此类的东西)。