Lớp AlarmManager cho phép lập lịch trình của báo động lặp đi lặp lại rằng sẽ chạy tại các điểm được thiết lập trong tương lai. AlarmManager được cấp PendingIntent để kích hoạt bất cứ khi nào báo thức được lên lịch. Khi báo động được kích hoạt , Mục đích đã đăng ký được phát sóng bởi hệ thống Android, bắt đầu ứng dụng đích nếu ứng dụng chưa chạy.
Tạo lớp kế thừa từ BroadcastReceiver. Trong phương thức onReceive, được gọi khi BroadcastReceiver nhận được Intent broadcast, chúng ta sẽ thiết lập mã chạy nhiệm vụ của chúng ta.
AlarmReceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// For our recurring task, we'll just display a message
Toast.makeText(arg0, "I'm running", Toast.LENGTH_SHORT).show();
}
}
Sau đó chúng tôi cần phải đăng ký BroadcastReceiver trong file manifest. Khai báo AlarmReceiver trong tệp kê khai.
<application>
.
.
<receiver android:name=".AlarmReceiver"></receiver>
.
.
</application>
Trong hoạt động gọi điện của bạn bao gồm các biến mẫu sau.
private PendingIntent pendingIntent;
private AlarmManager manager;
Trong onCreate(), chúng tôi tạo Intent tham chiếu lớp thu phát sóng và sử dụng nó trong PendingIntent.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Retrieve a PendingIntent that will perform a broadcast
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
}
Sau đó, chúng tôi sẽ bao gồm phương pháp sẽ thiết lập báo thức định kỳ. Sau khi cài đặt, báo thức sẽ kích hoạt sau mỗi lần X, ở đây chúng tôi lấy 10 giây ví dụ bạn có thể tính toán đơn giản này để kích hoạt nó mỗi ngày.
public void startAlarm(View view) {
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
int interval = 10000;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show();
}
Tiếp theo, chúng tôi cũng sẽ thiết lập phương thức cancelAlarm() để ngừng báo thức, nếu cần.
public void cancelAlarm(View view) {
if (manager != null) {
manager.cancel(pendingIntent);
Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show();
}
}
Câu trả lời trong [liên kết này] (http://stackoverflow.com/a/8801990/3800164) sẽ giúp bạn lên lịch nhiệm vụ trong tương lai. –
Sự hiểu biết của tôi là nếu ứng dụng của bạn đã thoát _before_ tác vụ được sinh ra, thì không, nó sẽ không thực thi. Nếu ứng dụng của bạn cố gắng thoát _while_ tác vụ đang chạy, thì hệ điều hành có thể chặn nó. Câu trả lời dưới đây bởi @jitesh có thể là những gì bạn đang tìm kiếm. –