Ожидание намерения не работает внутри службы
У меня есть приложение, которое при запуске настраивает сервис. Служба должна подать сигнал тревоги через 120 секунд. Но, хотя служба запускается, она не ждет 120 секунд. Вместо этого он сразу же подает сигнал тревоги.
До того, как я попытался внедрить службу, приложение работало нормально, т.е. при запуске приложения была задержка в 120 секунд, а затем сработала сигнализация.
Код:
Основная деятельность, которая запускает сервис:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Intent intent = new Intent(this, ServiceTest.class);
startService(intent);
}
Обслуживание:
public class ServiceTest extends IntentService {
public ServiceTest() {
super("ServiceTest");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent,flags,startId);
}
@Override
protected void onHandleIntent (Intent intent) {
Calendar cal = Calendar.getInstance(); //Create a calendar
cal.add(Calendar.SECOND, 120); //Add 120 seconds to the current time
Intent dialogIntent = new Intent(this, AlarmReceiverActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1234, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
}
}
И активность вызывает тревогу и вызывается службой преждевременно:
public class AlarmReceiverActivity extends Activity {
private MediaPlayer mMediaPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_alarm_receiver);
Button stopAlarm = (Button) findViewById(R.id.stopAlarm);
stopAlarm.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mMediaPlayer.stop();
finish();
}
});
playSound(this, getAlarmUri());
}
private void playSound(Context context, Uri alert) {
mMediaPlayer = new MediaPlayer();
try {
mMediaPlayer.setDataSource(context, alert);
final AudioManager audioManager = (AudioManager) context
.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
try {
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException e) {
System.out.println("Oops");
}
}
} catch (IOException e1) {
System.out.println("OOPS");
}
}
//Get an alarm sound. Try for an alarm. If none set, try notification,
//Otherwise, ringtone.
private Uri getAlarmUri() {
Uri alert = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alert == null) {
alert = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
if (alert == null) {
alert = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
}
}
return alert;
}
}
1 ответ
Решение
Удалить эту строку из Сервиса:
getApplication().startActivity(dialogIntent);
Вы говорите приложению запустить Activity, так оно и есть.:)
Вы, вероятно, хотели это dialogIntent
создать PendingIntent
вместо.