Итак, я работаю над Android-приложением для школьного проекта и поразил странную ошибку до конца разработки. Часть приложения - это Служба, которая работает в фоновом режиме и периодически проверяет сервер, но должна быть опция, следует ли запускать службу в фоновом режиме или скорее использовать ручные проверки. Чтобы избежать дублирования кода, то, что я пытался сделать, это передать Intent вместе с сервисом, когда он начинается с логического значения в строке "Принудительное обновление один раз, а затем остановитесь". Тем не менее, моя служба, похоже, не получает эту ценность.
Код, запускающий службу:
Intent intent = new Intent(this, EmpCheckinService.class);
intent.putExtra("singleCheckInOnly", true);
intent.putExtra("locationString", location);
startService(intent);
И код в классе службы:
// This is the old onStart method that will be called on the pre-2.0
// platform. On 2.0 or later we override onStartCommand() so this
// method will not be called.
@Override
public void onStart(Intent intent, int startId) {
examineIntent(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
examineIntent(intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
private void examineIntent(Intent intent) {
try {
singleCheckInOnly = intent.getExtras().getBoolean("singleCheckInOnly", false);
locationString = intent.getExtras().getString("locationString");
} catch (Exception e) {
// Don't need to do anything here, just prevent from crashing if the keys aren't found
}
}
Как вы можете видеть, у меня есть onStart и onStartCommand, чтобы он мог работать на устройствах с версией 1.5 или 2.1+, но он никогда не попадает ни в одну из этих функций. Может ли кто-нибудь указать мне в правильном направлении?
EDIT: Я думаю, что нашел проблему. Вызывается onCreate перед onStartCommand?
Вызывается onCreate перед onStartCommand?
Да.
Это будет значительно проще и удобнее, если вы:
Шаг # 1: Создайте IntentService
, а не Service
и
Шаг # 2: используйте AlarmManager
для отправки Intents
в службу для периодических проверок с сервером
Затем, с точки зрения обслуживания, нет никакой разницы между проверкой на основе таймера и проверкой, инициированной пользователем.
AlarmManager
и IntentService
.
если у вас есть более 1 дополнительного места, то предпочтительно использовать пакет
Tos отправлять дополнительные функции -
Intent i = new Intent(sender.this,receiver.class);
Bundle extras = new Bundle();
extras.putString("key1",element);
extras.putString("key1",element);
extras.putString("key2",element2);
extras.putString("key3",element3);
extras.putString("key4",element4);
......so on
i.putExtras(extras);
для использования -
Bundle extras2 = getIntent().getExtras();
if (extras != null){
final String str = extras2.getString("key1");
final String str = extras2.getString("key2");
final String str = extras2.getString("key3");
final String str = extras2.getString("key4");
final String str = extras2.getString("key5");
......so on
singleCheckInOnly = intent.getExtras().getBoolean("singleCheckInOnly", false)
)?