0

我正在开发将启动两个警报的应用程序,如下所示:

  1. 启动后每隔一小时重复一次闹铃
  2. 根据用户选择在 1 至 10 小时内不重复报警

两个警报都使用 ELAPSED_REALTIME_WAKEUP 类型。我现在面临的问题是相同的代码在 Android 2.3.5 但 Android 4.0.4 上运行良好。我对谷歌做了一些研究,问题似乎与“在第一次手动启动应用程序之前不会触发广播接收器”的问题有关。

以下是为两个警报设置待处理意图的代码:

private class AlarmEvent {
    private Intent mIntent;
    private PendingIntent mPendingIntent;

    protected AlarmEvent(Context ctx, Class<?> cls, int pendingIntentType,
                         int requestCode, int flags, String intentAction) {
        mIntent = new Intent(ctx, cls);
        mIntent.setAction(intentAction);

        switch(pendingIntentType) {
        case PENDING_BROADCAST:
            mPendingIntent = PendingIntent.getBroadcast(ctx, requestCode, mIntent, flags);
            break;
        case PENDING_SERVICE:
            mPendingIntent = PendingIntent.getService(ctx, requestCode, mIntent, flags);
            break;
        default:
            Log.w(TAG, "AlarmEvent:Invalid pending intent type=" + pendingIntentType);
        }
    }

    protected PendingIntent getPendingIntent() {
        return mPendingIntent;
    }
} 

以下是创建 AlarmEvent 的代码:

    //Create polling event
    mPollingEvent = new AlarmEvent(mCtx, EventRouter.class, PENDING_BROADCAST, 
                POLLING_REQUEST_CODE, PendingIntent.FLAG_CANCEL_CURRENT,
                EventRouter.POLLING_ACTION);
    //Create monitor event
    mReminderEvent = new AlarmEvent(mCtx, EventRouter.class, PENDING_BROADCAST,
                REMINDER_REQUEST_CODE, PendingIntent.FLAG_CANCEL_CURRENT,
                EventRouter.REMINDER_ACTION);

以下是启动警报的代码:

    //Get AlarmManager instance
    AlarmManager alarm = (AlarmManager)mCtx.getSystemService(AS);
    long triggerAtTime = 0;
    //Process the request
    switch(type) {
    case POLLING:
        triggerAtTime = SystemClock.elapsedRealtime();
        alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, 
                    POLLING_INTERVAL_MS, mPollingEvent.getPendingIntent());
        Log.d(TAG, "alarmRequest:Polling starts at " + System.currentTimeMillis());
        break;
    case REMINDER:
        triggerAtTime = SystemClock.elapsedRealtime() + when;
        alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, mReminderEvent.getPendingIntent());
            Log.d(TAG, "alarmRequest:Reminder to be fired after " + when + " ms");
        break;
    }

EventRouter的代码如下:

public class EventRouter extends BroadcastReceiver {
    public static final String POLLING_ACTION = "com.xxxxxx.POLLING";
    public static final String REMINDER_ACTION = "com.xxxxxx.REMINDER";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.d(TAG, "onReceive:Action=" + action);

        if(POLLING_ACTION.equals(action)) {
            //TODO: Polling handling
        }
        else if(REMINDER_ACTION.equals(action)) {
            //TODO: Reminder handling to fire a status bar notification
        }
    }
}

我的应用的 Android 清单:

<application 
    ...
    ...>
    <activity
        android:name=".AlarmActivity"
        ...>
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <receiver android:name=".EventRouter" android:enabled="true" android:exported="true"/>
</application>

通过在终端上执行以下命令正确注册了两个警报:

adb -d shell dumpsys alarm

但是,只有 POLLING 警报会发送到我的接收器。我在这个问题上苦苦挣扎了一段时间,找不到解决方案。您能帮忙检查一下我设置待处理意图的方式,看看是否有任何错误吗?

4

1 回答 1

0

您应该将您的操作作为意图过滤器添加到清单文件中的接收器声明中,以便它可以捕获这些操作。

<receiver android:name=".EventRouter" android:enabled="true" android:exported="true"
<intent-filter>
    <action android:name="your.receiver.package.name.POLLING_ACTION"></action>
</intent-filter>
<intent-filter>
    <action android:name="your.receiver.package.name.REMINDER_ACTION"></action>
</intent-filter>

<receiver/>

这是引起我注意的第一个错误。

于 2012-07-11T06:14:05.940 回答