Java 通知操作按钮dosen';不要停止闹钟铃声

Java 通知操作按钮dosen';不要停止闹钟铃声,java,android,service,android-notifications,alarm,Java,Android,Service,Android Notifications,Alarm,我设置了一个警报,我想在不打开活动的情况下使用通知操作按钮禁用正在进行的警报 我在下面附上了我的全部代码 当用户设置报警时,它会呼叫广播接收器,我会从他们那里呼叫我的铃声服务来启动铃声。它会发出通知。在该通知中,它将有一个禁用按钮。我已经完成了我在互联网上找到的所有资源。但是 通知上的禁用按钮不起作用。我的错在哪里 从主活动开始报警的切换按钮 public void OnToggleClicked(View view) { long time; if (((ToggleButto

我设置了一个警报,我想在不打开活动的情况下使用通知操作按钮禁用正在进行的警报

我在下面附上了我的全部代码

当用户设置报警时,它会呼叫广播接收器,我会从他们那里呼叫我的铃声服务来启动铃声。它会发出通知。在该通知中,它将有一个禁用按钮。我已经完成了我在互联网上找到的所有资源。但是

通知上的禁用按钮不起作用。我的错在哪里

从主活动开始报警的切换按钮

public void OnToggleClicked(View view) {
    long time;
    if (((ToggleButton) view).isChecked()) {
        Toast.makeText(MainActivity.this, "ALARM ON", Toast.LENGTH_SHORT).show();
        Calendar calendar = Calendar.getInstance();


        if (Build.VERSION.SDK_INT >= 23) {
            calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getHour());
            calendar.set(Calendar.MINUTE, alarmTimePicker.getMinute());
        } else {
            calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour());
            calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute());
        }

        intent = new Intent(this, AlarmReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        // setRepeating() lets you specify a precise custom interval--in this case,
        // 1 minutes.
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent);


    } else {
        alarmManager.cancel(pendingIntent);
        Toast.makeText(MainActivity.this, "ALARM OFF", Toast.LENGTH_SHORT).show();
    }
}
我的广播接收器类

public class AlarmReceiver extends BroadcastReceiver {
public static Ringtone ringtone;

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Alarm! Wake up! Wake up!", Toast.LENGTH_LONG).show();


    // using service class
    Intent i = new Intent(context, RingtonePlayingService.class);
    context.startService(i);

    createNotification(context);
}

public void createNotification(Context context) {


    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
            .setSmallIcon(android.R.drawable.ic_dialog_alert)
            .setContentTitle("It is prayer time")
            .setContentText("Prayer")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setSubText("Tab to cancel the ringtone")
            .setPriority(NotificationCompat.PRIORITY_HIGH);


    //To add a dismiss button
    Intent dismissIntent = new Intent(context, RingtonePlayingService.class);
    dismissIntent.setAction(RingtonePlayingService.ACTION_DISMISS);

    PendingIntent pendingIntent = PendingIntent.getService(context,
            123, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Action action = new NotificationCompat.Action
            (android.R.drawable.ic_lock_idle_alarm, "DISMISS", pendingIntent);
    builder.addAction(action);
    // end of setting action button to notification


    Intent intent1 = new Intent(context, MainActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(context, 123, intent1,
            PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pIntent);


    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(NOTIFICATION_SERVICE);
    Notification notification = builder.build();
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(123, notification);


}
public class RingtonePlayingService extends Service{
private static final String TAG = RingtonePlayingService.class.getSimpleName();
private static final String URI_BASE = RingtonePlayingService.class.getName() + ".";
public static final String ACTION_DISMISS = URI_BASE + "ACTION_DISMISS";

private Ringtone ringtone;

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

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.d(TAG, "onStartCommand");

    if(intent == null) {
        Log.d(TAG, "The intent is null.");
        return START_REDELIVER_INTENT;
    }

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null) {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    ringtone = RingtoneManager.getRingtone(this, alarmUri);
    ringtone.play();


    String action = intent.getAction();

    if(ACTION_DISMISS.equals(action))
        dismissRingtone();


    return START_NOT_STICKY;
}

public void dismissRingtone() {
    Intent i = new Intent(this, RingtonePlayingService.class);
    stopService(i);
}

@Override
public void onDestroy() {
    ringtone.stop();
}
我的铃声播放服务类

public class AlarmReceiver extends BroadcastReceiver {
public static Ringtone ringtone;

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Alarm! Wake up! Wake up!", Toast.LENGTH_LONG).show();


    // using service class
    Intent i = new Intent(context, RingtonePlayingService.class);
    context.startService(i);

    createNotification(context);
}

public void createNotification(Context context) {


    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
            .setSmallIcon(android.R.drawable.ic_dialog_alert)
            .setContentTitle("It is prayer time")
            .setContentText("Prayer")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setSubText("Tab to cancel the ringtone")
            .setPriority(NotificationCompat.PRIORITY_HIGH);


    //To add a dismiss button
    Intent dismissIntent = new Intent(context, RingtonePlayingService.class);
    dismissIntent.setAction(RingtonePlayingService.ACTION_DISMISS);

    PendingIntent pendingIntent = PendingIntent.getService(context,
            123, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Action action = new NotificationCompat.Action
            (android.R.drawable.ic_lock_idle_alarm, "DISMISS", pendingIntent);
    builder.addAction(action);
    // end of setting action button to notification


    Intent intent1 = new Intent(context, MainActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(context, 123, intent1,
            PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pIntent);


    NotificationManager notificationManager = (NotificationManager)
            context.getSystemService(NOTIFICATION_SERVICE);
    Notification notification = builder.build();
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(123, notification);


}
public class RingtonePlayingService extends Service{
private static final String TAG = RingtonePlayingService.class.getSimpleName();
private static final String URI_BASE = RingtonePlayingService.class.getName() + ".";
public static final String ACTION_DISMISS = URI_BASE + "ACTION_DISMISS";

private Ringtone ringtone;

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

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.d(TAG, "onStartCommand");

    if(intent == null) {
        Log.d(TAG, "The intent is null.");
        return START_REDELIVER_INTENT;
    }

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    if (alarmUri == null) {
        alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    }
    ringtone = RingtoneManager.getRingtone(this, alarmUri);
    ringtone.play();


    String action = intent.getAction();

    if(ACTION_DISMISS.equals(action))
        dismissRingtone();


    return START_NOT_STICKY;
}

public void dismissRingtone() {
    Intent i = new Intent(this, RingtonePlayingService.class);
    stopService(i);
}

@Override
public void onDestroy() {
    ringtone.stop();
}
那是我的错

当我点击disable on notification时,它会再次调用receiver类,这就是ringtone一直播放的原因。所以我做了一些修改,效果很好

public class RingtonePlayingService extends Service {
private static final String TAG = RingtonePlayingService.class.getSimpleName();
private static final String URI_BASE = RingtonePlayingService.class.getName() + ".";
public static final String ACTION_DISMISS = URI_BASE + "ACTION_DISMISS";


private Ringtone ringtone;

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand");

    if (intent == null) {
        Log.d(TAG, "The intent is null.");
        return START_REDELIVER_INTENT;
    }

    String action = intent.getAction();

    if (ACTION_DISMISS.equals(action))
        dismissRingtone();
    else {
        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        if (alarmUri == null) {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        }
        ringtone = RingtoneManager.getRingtone(this, alarmUri);
        ringtone.play();
    }

    return START_NOT_STICKY;
}

public void dismissRingtone() {
    // stop the alarm rigntone
    Intent i = new Intent(this, RingtonePlayingService.class);
    stopService(i);

    // also dismiss the alarm to ring again or trigger again
    AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    aManager.cancel(pendingIntent);

    // Canceling the current notification
    NotificationManager notificationManager =
            (NotificationManager)getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
    notificationManager.cancel(321);
}

@Override
public void onDestroy() {
    ringtone.stop();
}}