AlarmManager无法正常工作

时间:2015-07-13 17:07:57

标签: android service alarmmanager

您好我正在使用演示应用,我使用AlarmManager每天8:00安排服务。我正在使用Calendar在8:00时间安排服务,但此AlarmManager未在预定时间甚至30分钟后运行服务。

以下是我的代码: -

public static void scheduleVerseNotificationService(Context mContext) {
    AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(mContext, DailyVerseNotificationService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);

    // Set the alarm to start at approximately 08:00 morning.
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 8);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

}

TestService.java

public class TestService extends Service {
    public TestService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        try {
            // Code
        } catch (Exception e) {
            Logger.e(Constants.TAG, e.getMessage());
        }
        stopSelf();
    }
}

的AndroidManifest.xml

<service
    android:name="com.service.TestService"
    android:enabled="true"
    android:exported="true" />

提前致谢。

2 个答案:

答案 0 :(得分:1)

两种解决方案: 1)而不是

    PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);

使用

    PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, intent, 0);

2)如果这不起作用,那么你需要创建一个警报接收器

 public class AlarmReceiver extends WakefulBroadcastReceiver {
    @Override
     public void onReceive(Context context, Intent intent) {

       Log.i("AlarmReceiver", "onReceive");

      ComponentName comp = new ComponentName(context.getPackageName(),
        DailyVerseNotificationService.class.getName());
      startWakefulService(context, (intent.setComponent(comp)));
      setResultCode(Activity.RESULT_OK);
     }

 }

将您的未决意图更改为

     Intent intent = new Intent(mContext, AlarmReciever.class);
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);

在清单

中注册接收器
     <receiver android:name="com.example.myApp.AlarmReceiver" /> 

最后将权限放在清单

    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

请参考以下内容: https://developer.android.com/training/scheduling/alarms.html

以上链接将指导您在“设备启动时启动警报”部分中创建启动接收器。

还要确保设置:

    calendar.set(Calendar.MINUTE, 0); // for 0 minutes
    calendar.set(Calendar.SECOND, 0); // for 0 seconds

答案 1 :(得分:0)

只是添加到Bhushan回答。

确保在启动时设置警报,因为如果关闭并重新启动设备,则会清除所有已注册的警报。