Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java cancelAlarm方法不实际取消我的AlarmManager_Java_Android_Service_Alarm - Fatal编程技术网

Java cancelAlarm方法不实际取消我的AlarmManager

Java cancelAlarm方法不实际取消我的AlarmManager,java,android,service,alarm,Java,Android,Service,Alarm,我使用了堆栈上另一个著名答案中的cancelAlarm方法,但它没有完成工作,我不知道为什么它不起作用 我有一个活动,其中一个按钮将启动一个警报,该警报将在每个给定的时间间隔发出。然后,我有另一个按钮,将取消报警。以下是第一个按钮: start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setupAl

我使用了堆栈上另一个著名答案中的
cancelAlarm
方法,但它没有完成工作,我不知道为什么它不起作用

我有一个活动,其中一个按钮将启动一个警报,该警报将在每个给定的时间间隔发出。然后,我有另一个按钮,将取消报警。以下是第一个按钮:

    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();
            }
        }
    });
下面是我的
setupAlarm
cancelAlarm
方法:

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创建另一个报警管理器,然后调用
alarmManager.cancel(发送方)pendingent
上选择code>,但它似乎没有做任何事情,因为我的服务无论如何都会重新启动

报警接收器等级:

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
类不断向我敬酒,告诉我我的
onCreate
onStart
被成功实例化,即使调用了我的
cancelAlarm
方法。

使用与创建
Alarm
时相同的
pendingContent
。在
意图中使用
AlarmReceiver.class
而不是
AlarmManager.class

Intent i = new Intent(getBaseContext(), AlarmReceiver.class);
更新
cancelAlarm()
方法如下:

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

希望这会有所帮助~

你能发布你的AlarmReceiver代码吗?以及你的MyServiceclass@AndrewEl-Masry添加了bothDo您是否在android清单中注册了广播接收器?为什么在创建时使用
ALARM\u ID
,取消时的
alarmId
?添加
PendingEvent.FLAG\u UPDATE\u CURRENT
是否是此处唯一的更改?如果是这样,我只是测试了它,它没有效果。不,在您的Intent>
Intent I=newintent(getBaseContext(),AlarmReceiver.class)中使用
AlarmReceiver.class
而不是
AlarmManager.class