2017-07-27 3 views
-1

私はこのcancelAlarmメソッドを別の評判の良い答えからスタックに入れて使用していますが、これはうまくいきません。cancelAlarmメソッドは実際に私のAlarmManagerをキャンセルしていません

私は1つのボタンが所定の間隔ごとに消えるアラームを開始するアクティビティを持っています。私はその後、そのアラームをキャンセルする別のボタンがあります。

start.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      setupAlarm(10); 
     } 
    }); 

    stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try{ 
       cancelAlarm(ALARM_ID); 
      } catch(Exception e){ 
       Toast.makeText(getApplicationContext(), "ERROR", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 

そして、ここで私のsetupAlarmcancelAlarmメソッドです:ここではボタンが最初です

private void setupAlarm(int seconds) { 
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Intent i = new Intent(getBaseContext(), AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
      MainActivity.this, ALARM_ID, i, PendingIntent.FLAG_UPDATE_CURRENT); 
    Calendar t = Calendar.getInstance(); 
    t.setTimeInMillis(System.currentTimeMillis()); 

    int interval = seconds*1000; 
    am.setRepeating(AlarmManager.RTC_WAKEUP, t.getTimeInMillis(), interval, pendingIntent); 
    MainActivity.this.finish(); 
} 

private void cancelAlarm(int alarmId){ 
    Intent i = new Intent(getBaseContext(), AlarmManager.class); 
    PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, alarmId, i, 0); 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.cancel(sender); 
    sender.cancel(); 
} 

は、私は同じIDを持つ別のアラームマネージャを作成し、PendingIntentalarmManager.cancel(sender);を呼び出すために思い出したが、それはdoesnのとにかく、私のサービスはとにかく元気を回復するからです。

AlarmRecieverクラス:

public class AlarmReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Context oAppContext = context.getApplicationContext(); 

    if (oAppContext == null) { 
     oAppContext = context; 
    } 

    Intent serviceIntent = new Intent(oAppContext, MyService.class); 
    oAppContext.startService(serviceIntent); 
} 
} 

たMyServiceクラス:

public class MyService extends Service implements SensorEventListener{ 

private PowerManager.WakeLock wakeLock; 

Sensor mSensor; 
SensorManager mSensorManager; 
String toastString = ""; 

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

@Override 
public void onCreate(){ 
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); 

    PowerManager mgr = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); 
    wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
    wakeLock.acquire(); 


    Toast.makeText(this, "onCreate Successful", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startid) { 
    Toast.makeText(this, "onStart Successful", Toast.LENGTH_SHORT).show(); 
    return Service.START_STICKY; 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    //record some data from the accelerometer 
    quit(); 
} 

@Override 
public void onAccuracyChanged(Sensor sensor, int accuracy) { 

} 

private void quit(){ 
    mSensorManager.unregisterListener(MyService.this); 
    wakeLock.release(); 
    this.stopSelf(); 
} 
} 

そして、私は私のonCreateonStartが正常にも、私を呼び出した後に、インスタンス化されたことを私に言って、私のMyServiceクラスから乾杯を得ることに保ちますcancelAlarm方法。

+0

は、あなたのAlarmReceiverコードを投稿することができます〜するのに役立ちますか? –

+0

とMyServiceクラス –

+0

@ AndrewEl-Masry両方を追加しました – cjnash

答えて

1

Alarmの作成時に使用したものと同じPendingIntentを使用してください。以下のように

Intent i = new Intent(getBaseContext(), AlarmReceiver.class); 

更新cancelAlarm()方法:あなたのIntentAlarmReceiver.class代わりのAlarmManager.classを使用

private void cancelAlarm(int alarmId){ 
    Intent i = new Intent(getBaseContext(), AlarmReceiver.class); 
    PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, alarmId, i, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.cancel(sender); 
    sender.cancel(); 
} 

希望これは

+0

は'PendingIntent.FLAG_UPDATE_CURRENT'はここの唯一の変更ですか?もしそうなら、私はそれをテストしただけで効果はありません。 – cjnash

+0

いいえ、あなたのIntent >> 'Intent i = new Intent(getBaseContext()、AlarmReceiver.class);' AlarmManager.class'の代わりに 'AlarmReceiver.class'を使用してください。 – FAT

関連する問題