web-dev-qa-db-ja.com

別のpendingintentでAlarmManagerpendingIntentをキャンセルします

サービスを定義するAlarmManagerをキャンセルしたいのですが、このサービスでは、新しいAlarmMangerを開始するか、以前に定義したアラームをキャンセルする可能性があります。alarmManager.cancel(PendingIntent)のパラメータpendingintentは、同じである必要があります。しかし、それでも機能しません。キャンセルに失敗しました。これが私のコードです

public class GetRoundStroe {
    private Store[] stores;
    private Context mContext;

    public GetRoundStroe(Context mContext) {
        this.mContext = mContext;
    }

    public Store[] getStores() {
        if (ComCommand.haveInternet(mContext)) {
            start_am_normal();
        } else {
            start_am_silence();
        }
        return stores;
    }

    public Store[] start_am_silence() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmNormal != null) {
            am.cancel(AlarmHolder.mAlarmNormal);

        }

        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getSilence_time(), AlarmHolder.mAlarmSilence);


        return null;


    }

    public Store[] start_am_normal() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmSilence != null) {
            MyLog.e(GetRoundStroe.class,"AlarmHolder.mAlarmSilence"+AlarmHolder.mAlarmSilence+"");
            am.cancel(AlarmHolder.mAlarmSilence);
        }
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getNormal_time(), AlarmHolder.mAlarmNormal);

        return null;
    }

    private static final class AlarmHolder {
        static final PendingIntent mAlarmSilence = PendingIntent.getService(ApplicationContext.getInstance(),
                0,
                new Intent(ApplicationContext.getInstance(), GetRoundSilenceService.class),
                0);

        static final PendingIntent mAlarmNormal = PendingIntent.getService(ApplicationContext.getInstance(),
                0, new
                Intent(ApplicationContext.getInstance(), GetRoundNormalService.class),
                0);

    }
}

GetRoundSilenceServiceおよびGerRoundNormalServiceは、start_am_normal()またはstart_am_silenceを呼び出します。誰かが私を助けることができますか?ありがとう

23
Albert.Qing
   myIntent = new Intent(SetActivity.this, AlarmActivity.class);
   pendingIntent = PendingIntent.getActivity(CellManageAddShowActivity.this,
       id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
   pendingIntent.cancel();
   alarmManager.cancel(pendingIntent);

これらのコード行は、保留中のインテントとアラームを削除/キャンセルするのに役立ちます。

あなたが必要とする主なものは:

  1. 同じIDと適切なインテントFLAGを使用して保留中のインテントを作成します。
  2. その保留中のインテントをキャンセルします。
  3. アラームマネージャを使用してアラームをキャンセルします。
63
MKJParekh

@MKJParekhの答えは正しいですが、何が機能し、何が機能しないかを全員が理解できるように、さらに情報を追加したいと思います。

たとえば、activityAでAlarmManagerを作成して30秒でactivityCを開くように設定し、その後、他のアクティビティで、そのAlarmManagerをキャンセルしたいとします。したがって、次のようにします。

activityAでは、AlarmManagerを作成して設定します。

_//activityA
Intent myIntentA = new Intent(actvityA.this, activityB.class)
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent myPendingIntent = PendingIntent.getActivity(activityA.this, 0, myIntentA, PendingIntent.FLAG_ONE_SHOT);

//Calendar with the time we want to fire the Alarm
Calendar calendar = Calendar.getInstance();   // Get Current Time
calendar.add(Calendar.SECOND,30);      //Fire Alarm in 30 seconds from Now.                  

((AlarmManager)getSystemService(ALARM_SERVICE)).setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), myPendingIntent);
_

しばらくしてから別のアクティビティで、アクセスできないactivityAで作成されたAlarmManagerをキャンセルしたいと思います。この現在のアクティビティをactivityZと呼びましょう。

_//activityZ
Intent myIntentZ = new Intent(activityZ.this, activityB.class);
PendingIntent pendingIntentZ = PendingIntent.getActivity(activityZ.this, 0, myIntentZ, PendingIntent.FLAG_ONE_SHOT);

((AlarmManager)getSystemService(ALARM_SERVICE)).cancel(pendingIntentZ);
_

いくつかの重要なポイント、

new Intent(context)getActivity(context)のactivityAで提供するコンテキストは同じですが、この場合、AlarmManagerをキャンセルするアクティビティと一致する必要はありません。ケースactivityZには別のコンテキストがあります。

AlarmManagerで開きたいクラスは両方のアクティビティnew Intent (context, activityB.class)で同じである必要があり、intであるrequestCodeは同じである必要があります。これには_0_を使用しました例。最後に、フラグは両方のアクティビティで同じである必要があります_PendingIntent.FLAG_ONE_SHOT_。

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);が使用されたのは、既存のアクティビティのコンテキスト外でアクティビティを開始する場合に PendingIntent.getActivity が必要になるためです。

0
ArtiomLK