Một trong những ứng dụng của tôi làm điều gì đó rất giống. Để đánh thức dịch vụ sau một khoảng thời gian nhất định, tôi khuyên bạn nênpostDelayed()
Có một trường xử lý:
private final Handler handler = new Handler();
và bồi bổ Runnable
private final Runnable refresher = new Runnable() {
public void run() {
}
};
Bạn có thể kích hoạt Thông báo của mình ở chế độ chạy được.
Khi xây dựng dịch vụ và sau mỗi lần thực thi, hãy bắt đầu như vậy:
handler.postDelayed(refresher, );
Trong onDestroy()
xóa bài đăng
handler.removeCallbacks(refresher);
Để bắt đầu dịch vụ lúc khởi động, bạn cần có bộ khởi động tự động. Điều này có trong tệp kê khai của bạn
<receiver android:name="com.example.ServiceAutoStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
và ServiceAutoStarter
trông như thế này:
public class ServiceAutoStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, UpdateService.class));
}
}
Việc ngăn chặn hệ điều hành giết chết dịch vụ là một việc khó khăn. Ngoài ra, ứng dụng của bạn có thể gặp lỗi RuntimeException
và bị treo, hoặc logic của bạn có thể bị đình trệ.
Trong trường hợp của tôi, nó có vẻ hữu ích khi luôn làm mới dịch vụ trên màn hình với a BroadcastReceiver
. Vì vậy, nếu chuỗi cập nhật bị đình trệ, nó sẽ được phục hồi khi người dùng sử dụng điện thoại của họ.
Trong dịch vụ:
private BroadcastReceiver screenOnReceiver;
Trong dịch vụ của bạn onCreate()
screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
Sau đó, hủy đăng ký dịch vụ của bạn onDestroy()
với
unregisterReceiver(screenOnReceiver);