Tôi cần kích hoạt một khối mã sau 20 phút kể từ khi AlarmManager
được đặt.
Ai đó có thể chỉ cho tôi mã mẫu về cách sử dụng một AlarmManager
trong ِ Android không?
Tôi đã thử với một số mã trong vài ngày và nó sẽ không hoạt động.
Câu trả lời:
"Một số mã mẫu" không phải là dễ dàng khi nói đến AlarmManager
.
Đây là một đoạn mã hiển thị thiết lập của AlarmManager
:
AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);
Trong ví dụ này, tôi đang sử dụng setRepeating()
. Nếu bạn muốn báo thức một lần, bạn chỉ cần sử dụng set()
. Đảm bảo cung cấp thời gian để báo thức bắt đầu trong cùng thời gian mà bạn sử dụng trong tham số ban đầu set()
. Trong ví dụ của tôi ở trên, tôi đang sử dụng AlarmManager.ELAPSED_REALTIME_WAKEUP
, vì vậy cơ sở thời gian của tôi là SystemClock.elapsedRealtime()
.
Đây là một dự án mẫu lớn hơn cho thấy kỹ thuật này.
Có một số ví dụ điển hình trong mã mẫu android
. \ android-sdk \ samples \ android-10 \ ApiDemos \ src \ com \ example \ android \ apis \ app
Những thứ nên kiểm tra là:
Trước tiên, bạn cần một bộ thu, một thứ có thể nghe báo thức của bạn khi nó được kích hoạt. Thêm phần sau vào tệp AndroidManifest.xml của bạn
<receiver android:name=".MyAlarmReceiver" />
Sau đó, tạo lớp sau
public class MyAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
}
}
Sau đó, để kích hoạt báo thức, hãy sử dụng thông tin sau (ví dụ: trong hoạt động chính của bạn):
AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, 30);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);
.
Hoặc, tốt hơn, tạo một lớp xử lý tất cả và sử dụng nó như thế này
Bundle bundle = new Bundle();
// add extras here..
MyAlarm alarm = new MyAlarm(this, bundle, 30);
bằng cách này, bạn có tất cả ở một nơi (đừng quên chỉnh sửa AndroidManifest.xml
)
public class MyAlarm extends BroadcastReceiver {
private final String REMINDER_BUNDLE = "MyReminderBundle";
// this constructor is called by the alarm manager.
public MyAlarm(){ }
// you can use this constructor to create the alarm.
// Just pass in the main activity as the context,
// any extras you'd like to get later when triggered
// and the timeout
public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
AlarmManager alarmMgr =
(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyAlarm.class);
intent.putExtra(REMINDER_BUNDLE, extras);
PendingIntent pendingIntent =
PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
Calendar time = Calendar.getInstance();
time.setTimeInMillis(System.currentTimeMillis());
time.add(Calendar.SECOND, timeoutInSeconds);
alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
pendingIntent);
}
@Override
public void onReceive(Context context, Intent intent) {
// here you can get the extras you passed in when creating the alarm
//intent.getBundleExtra(REMINDER_BUNDLE));
Toast.makeText(context, "Alarm went off", Toast.LENGTH_SHORT).show();
}
}
Điều bạn cần làm trước tiên là tạo ra ý định mà bạn cần để lên lịch. Sau đó, nhận được pendingIntent của ý định đó. Bạn có thể lên lịch các hoạt động, dịch vụ và chương trình phát sóng. Để lên lịch một hoạt động, ví dụ như MyActivity:
Intent i = new Intent(getApplicationContext(), MyActivity.class);
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),3333,i,
PendingIntent.FLAG_CANCEL_CURRENT);
Cung cấp PendingIntent này cho alertManager:
//getting current time and add 5 seconds in it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);
Bây giờ MyActivity sẽ được khởi chạy sau 5 giây kể từ khi khởi chạy ứng dụng, bất kể bạn dừng ứng dụng hoặc thiết bị của bạn ở trạng thái ngủ (do tùy chọn RTC_WAKEUP). Bạn có thể đọc mã mẫu hoàn chỉnh Lập lịch hoạt động, dịch vụ và chương trình phát sóng #Android
Một số mã mẫu khi bạn muốn gọi một dịch vụ từ Alarmmanager:
PendingIntent pi;
AlarmManager mgr;
mgr = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);
pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1000, pi);
Bạn không cần phải yêu cầu quyền của người dùng.
AlarmManager được sử dụng để kích hoạt một số mã tại một thời điểm cụ thể.
Để khởi động Trình quản lý báo thức, trước tiên bạn cần lấy phiên bản từ Hệ thống. Sau đó, chuyển PendingIntent sẽ được thực thi vào một thời điểm trong tương lai mà bạn chỉ định
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(context, MyAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
int interval = 8000; //repeat interval
manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Bạn cần phải cẩn thận khi sử dụng Trình quản lý báo động. Thông thường, trình quản lý báo thức không thể lặp lại trước một phút. Ngoài ra ở chế độ năng lượng thấp, thời lượng có thể tăng lên đến 15 phút.