如何解决带有前台服务的警报以在 android 中安排短信
我有一个应用程序,我在其中设置了警报以使用前台服务自动发送消息。一切正常,但是当警报响起时,它会一直发送消息,直到我单击按钮停止服务。我想要做的是,当闹钟不连续响起时,我只想发送一次消息。
下面是我的服务类的代码
public class MyService extends Service {
private Integer alarmHour;
private Integer alarmMinute;
private Ringtone ringtone;
private Timer t = new Timer();
private static final String CHANNEL_ID = "MyNotificationChannelID";
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
alarmHour = intent.getIntExtra("alarmHour",0);
alarmMinute = intent.getIntExtra("alarmMinute",0);
ringtone = RingtoneManager.getRingtone(getApplicationContext(),RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE));
try {
Intent notificationIntent = new Intent(this,Alarm.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,notificationIntent,0);
Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID )
.setContentTitle("My Alarm clock")
.setContentText("Alarm time - " + alarmHour.toString() + " : " + alarmMinute.toString())
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(pendingIntent)
.build();
startForeground(1,notification);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID,"My Alarm clock Service",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(notificationChannel);
}
}
catch (Exception e){
e.printStackTrace();
}
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (Calendar.getInstance().getTime().getHours() == alarmHour &&
Calendar.getInstance().getTime().getMinutes() == alarmMinute){
String phoneNumber="12345678";
String message="I need help.";
SmsManager smsManager=SmsManager.getDefault();
smsManager.sendTextMessage(phoneNumber,null,message,null);
ringtone.play();
}else{
ringtone.stop();
}
}
},2000);
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
t.cancel();
ringtone.stop();
super.onDestroy();
}
}
由于 scheduleAtfixed 速率,它不断发送消息,但是当我将方法更改为仅调度时,它仅在应用程序启动时工作一次。如果我再次设置闹钟,它将不起作用。现在我很困惑。使用 scheduleAtfixedrate 它会不断发送消息,而使用 schedule 应用程序只在应用程序启动时工作一次,如果我再次设置警报就不起作用。请告诉我一个方法,一旦闹钟响起,它应该只发送一次消息。我也尝试使用 BroadcastReceiver 执行此操作,但没有发送消息。
这是我的闹钟活动代码,用于设置和取消闹钟服务。
public class Alarm extends AppCompatActivity {
private TimePicker timePicker;
Button button,buttoncancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm);
button=(Button)findViewById(R.id.button);
buttoncancel=(Button)findViewById(R.id.buttoncancel);
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS},PackageManager.PERMISSION_GRANTED);
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.FOREGROUND_SERVICE},PackageManager.PERMISSION_GRANTED);
timePicker = findViewById(R.id.timPicker);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(Alarm.this,MyService.class);
ServiceCaller(intent1);
}
});
buttoncancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(Alarm.this,MyService.class);
stopService(intent1);
}
});
}
private void ServiceCaller(Intent intent){
Integer alarmHour = timePicker.getCurrentHour();
Integer alarmMinute = timePicker.getCurrentMinute();
intent.putExtra("alarmHour",alarmHour);
intent.putExtra("alarmMinute",alarmMinute);
startService(intent);
}
}
我只希望我的应用设置警报并使用前台服务通过该警报发送消息。请指导我如何实现这一目标。我会非常感谢你。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。