【问题标题】:Pending intent get service待定意图获取服务
【发布时间】:2013-07-30 23:08:01
【问题描述】:

我无法让我的pendingIntent 触发。我已经使用 logcat 等进行了一些故障排除,最后我几乎可以肯定我的问题实际上出在我的 pendingIntent 方法中。我设置的时间是正确的,并且该方法被调用,但在预定时间没有任何反应。 这是我用来创建pendingIntent的方法@

public void scheduleAlarm(){
    Log.d("Alarm scheduler","Alarm is being scheduled");
    Intent changeVol = new Intent();
    changeVol.setClass(this, VolumeService.class);
    PendingIntent sender = PendingIntent.getService(this, 0, changeVol, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, sender);
    //Toast.makeText(this, "Volume Adjusted!", Toast.LENGTH_LONG).show();
}

这里是服务类:

public class VolumeService extends Service{

@Override
public void onCreate() {
    super.onCreate();
    Log.d("Service", "Service has been called.");
    Toast.makeText(getApplicationContext(), "Service Called!", Toast.LENGTH_LONG).show();
}

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

}

scheduleAlarm() 类中的日志正在按我的计划工作,但是没有任何反应,所以我认为它是我的pendingIntent。 提前致谢!

【问题讨论】:

  • 能否请您提供您如何获得时间价值?你使用系统。 currentTimeMillis() + 一些时间延迟?你在 AndroidManifest.xml 中定义了服务吗?
  • @VladimirLichonos 时间由用户使用timePicker dialog 提供,我使用 logCat 进行了三次检查,以确保时间选择正确;它是。例如,我今天早些时候检查了它并输入了下午 3:45(MST),当我检查 long 保存的值时,它正确显示为 2013 年 7 月 30 日下午 3:45(MST)。您问题的第二部分,我使用以下 sn-p <service android:enabled="true" android:name=".services.VolumeService" /> 添加到清单中。
  • 嗯,这对我来说似乎很好,但我会尝试通过取消警报并取消并再次创建待定意图来进行更多测试。还尝试仅使用 System.currentTimeMillis() 进行测试。它应该可以工作,并且可能会告诉您问题出在哪里。

标签: android android-intent service alarmmanager android-pendingintent


【解决方案1】:

想通了!问题出在 Service 类中,我也改变了一些其他的东西。 但是,我认为主要问题是在onCreate 方法的服务类中,我试图运行我的代码。但这需要在onStartCommand 方法中完成

public class VolumeService extends Service{

@Override
public void onCreate() {
    super.onCreate();

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(getApplicationContext(), "Service started", Toast.LENGTH_LONG).show();
    return START_NOT_STICKY;
 }


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

}

并在启动服务的类中进行了一些更改,如下所示:

    public void scheduleAlarm(){
    Log.d("Alarm scheduler","Alarm is being scheduled");
    Intent intent = new Intent(AlarmSettings.this, VolumeService.class);
    PendingIntent pintent = PendingIntent.getService(AlarmSettings.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.set(AlarmManager.RTC_WAKEUP, time, pintent);
}

【讨论】:

  • 即使应用程序被杀死,这对你有用吗?我尝试了类似的代码,但它似乎只有在应用程序仍然存在时才能运行(这没有抓住重点......)。根据 logcat,AlarmManager 甚至不会触发警报,更不用说调用意图了..
  • @SagiMann-TROPHiT 是的,对我来说它运行良好,即使它被杀死,正如你所说,这就是重点。抱歉,我帮不上忙。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多