待定意图获取服务

5

我遇到了一个问题,就是我的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有问题。提前感谢!


请问您是如何获取时间值的?您是使用System.currentTimeMillis()加上一定的延迟时间吗?您有在AndroidManifest.xml中定义服务吗? - Volodymyr Lykhonis
@VladimirLichonos 用户使用 timePicker dialog 提供时间,我已经三次使用 logCat 确认时间选择正确;它是正确的。例如,我今天早些时候检查了它,输入了下午 3:45(MST),当我检查保存的 long 值时,它正确地显示为 2013 年 7 月 30 日下午 3:45(MST)。至于你问题的第二部分,我使用以下代码段将其添加到清单中 <service android:enabled="true" android:name=".services.VolumeService" /> - The Dude
嗯,对我来说看起来没问题,但我会尝试更多地测试取消警报和取消并创建待定意图。还可以尝试仅使用System.currentTimeMillis()进行测试。它应该能够工作,并可能向您展示问题所在。 - Volodymyr Lykhonis
1个回答

8

问题已解决!问题出在Service类中,我还对其他一些内容进行了修改。 不过我认为主要问题是在我的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甚至没有触发警报,更不用说调用意图了。 - Sagi Mann
@SagiMann-TROPHiT 对我来说,即使被杀死,它也能正常运行,正如你所说,这是重点。很抱歉我无法提供更多帮助。 - The Dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接