Tôi đang tạo ứng dụng sẽ kích hoạt thông báo vào các khoảng thời gian cụ thể trong thời gian người dùng thức giấc.Sử dụng alarmManager và dịch vụ để thực hiện thông báo lịch biểu chỉ trong khoảng thời gian cụ thể
Tôi có một AlarmManager đang chạy bên trong một dịch vụ. Dịch vụ này được bắt đầu rõ ràng thông qua nút bấm vào hoạt động chính và có thông báo thực thi alarmManager trong các khoảng thời gian cụ thể. Làm cách nào để tôi dừng thông báo trong một số giờ nhất định trong ngày? Ví dụ: tôi không muốn các thông báo này được kích hoạt trong khi người dùng đang ngủ.
Mã của tôi hiện đang bắn thông báo trong khoảng thời gian do người dùng thiết lập dưới (nhập khẩu lấy ra .... đây là dài đủ đã được):
public class FartSmackinChunks extends Service {
public Notification scheduleNotification;
public AlarmManager alarmScheduleManager;
public PendingIntent alarmScheduleIntent;
private Boolean autoUpdateBoolean = true;
private int intervalsGoneByInt = 0;
private Notification notification;
public static final int NOTIFICATION_ID = 1;
@Override
public void onCreate() {
// TODO: Actions to perform when service is created.
int icon = R.drawable.icon;
String tickerText = "INTERVAL FIRED";
long when = System.currentTimeMillis();
scheduleNotification = new Notification(icon, tickerText, when);
alarmScheduleManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
String ALARM_ACTION;
ALARM_ACTION = ScheduleAlarmReceiver.ACTION_REFRESH_SCHEDULE_ALARM;
Intent intentToFire = new Intent(ALARM_ACTION);
alarmScheduleIntent = PendingIntent.getBroadcast(this, 0, intentToFire,
0);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
SharedPreferences mySharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean autoUpdateBoolean =
mySharedPreferences.getBoolean("storedAutoUpdateBoolean", false);
String updateFreq =
mySharedPreferences.getString("storedInitialAverageTimeInterval", "00:00:00");
SimpleDateFormat dfInterval = new SimpleDateFormat("hh:mm:ss");
Date intervalTimeAsDateObject = null;
long updateFreqMilliLong;
try {
intervalTimeAsDateObject = dfInterval.parse(updateFreq);
} catch (ParseException e) {
e.printStackTrace();
}
updateFreqMilliLong = intervalTimeAsDateObject.getTime() - 18000000;
if (autoUpdateBoolean) {
int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
long timetoRefresh = SystemClock.elapsedRealtime() +
updateFreqMilliLong;
alarmScheduleManager.setInexactRepeating(alarmType,
timetoRefresh, updateFreqMilliLong, alarmScheduleIntent);
notifications();
} else alarmScheduleManager.cancel(alarmScheduleIntent);
return Service.START_NOT_STICKY;
};
private void notifications() {
**notification stuff in here***
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Replace with service binding implementation.
return null;
}
@Override
public void onDestroy() {
this.alarmScheduleManager.cancel(alarmScheduleIntent);
}
}
..... và thực hiện phát sóng thu của tôi ở đây :
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ScheduleAlarmReceiver extends BroadcastReceiver {
public static final String ACTION_REFRESH_SCHEDULE_ALARM
= "com.application.ACTION_REFRESH_SCHEDULE_ALARM";
@Override
public void onReceive(Context context, Intent intent) {
Intent startIntent = new Intent(context, SmokerReducerService.class);
context.startService(startIntent);
}
}
Tôi đang gặp khó khăn trong việc gói gọn bộ não của mình về cách triển khai.
Tôi đã suy nghĩ để làm lại mã này để cảnh báo được kích hoạt lúc bấy giờ và dừng lại lúc sleepTime, tất cả trong khi bên trong dịch vụ là Bộ hẹn giờ kích hoạt phương thức thông báo tại các khoảng thời gian cụ thể? Có cách nào tốt hơn để thực hiện việc này không?
Bất kỳ đầu vào nào cũng sẽ được đánh giá cao. Tôi đã cố gắng để làm việc này trong đầu của tôi trong nhiều ngày nay.
Cảm ơn
EDIT: @anyone ai đi qua này có ý định sử dụng một Timer cho các thông báo hàng ngày:
Một giờ mà chạy bên trong của một dịch vụ sẽ được tạm dừng bởi thời gian chạy khi thiết bị được đặt vào chế độ ngủ (tức là ... người dùng đặt điện thoại ở chế độ chờ). Do đó, việc sử dụng Bộ hẹn giờ để kích hoạt thông báo vào các khoảng thời gian cụ thể sẽ không hoạt động chính xác trong một dịch vụ vì khi Android tạm dừng dịch vụ, nó cũng tạm dừng bộ hẹn giờ.
Cách chính xác để thực hiện việc này là sử dụng AlarmManager với một loạt các mục đích đang chờ xử lý để đặt báo thức vào những thời điểm cụ thể trong ngày. Điều này đảm bảo rằng ngay cả khi điện thoại được đặt ở chế độ chờ, các thông báo (hoặc bất kỳ điều gì bạn muốn xảy ra tại thời điểm đó) sẽ vẫn được thực thi.
'mySharedPreferences.getBoolean' bị thiếu -' // TODO: Hành động thực hiện khi dịch vụ được tạo' cần thiết? (trong câu hỏi ít nhất - các TODO khác là Ok) Ngoài ra tại sao sử dụng một dịch vụ (chạy dài)? –
@Mr_and_Mrs_D - Tôi đã kết thúc bằng cách sử dụng lớp AlarmManager với một loạt các ý định đang chờ xử lý để thực hiện việc này. – dell116