0

次のように2つのアラームを開始するアプリに取り組んでいます:

  1. アラームが開始されると、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