2017-07-27 144 views
-1

我已经使用这个cancelAlarm方法从栈上的另一个有信誉的答案,它没有完成工作,我不知道为什么这不起作用的想法。cancelAlarm方法实际上并没有取消我的AlarmManager

我有一个活动,其中一个按钮将启动一个警报,每隔一段时间就会关闭。然后我有另一个按钮,将取消该警报。下面是按钮第一:

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);但它不看起来什么都不做,因为我的服务无论如何都会重新开始。

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(); 
} 
} 

我不停的从我的MyService类获得祝酒词告诉我,我onCreateonStart成功实例,即使打完电话后我的cancelAlarm方法。

+0

您可以发布您AlarmReceiver代码? –

+0

和您的MyService类 –

+0

@ AndrewEl-Masry添加了 – cjnash

回答

1

使用创建时使用的相同PendingIntentAlarm

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

更新cancelAlarm()如下方法:在你的Intent使用AlarmReceiver.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)中使用'AlarmReceiver.class'而不是'AlarmManager.class';'' – FAT