2013-10-02 4 views
2

У меня есть Service, что я хотел использовать функцию startForeground() в:Bad уведомления в startForeground: contentIntent требуется ошибка на Android 2.3.4

public void putServiceToForeground() { 
    if (notif == null) { 

     notif = new NotificationCompat.Builder(this) 
     .setContentTitle("Location Updates Service") 
     .setContentText("Getting Location Updates") 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setTicker(getText(R.string.location_service_starting)) 
     .build(); 
    } 
    startForeground(notificationID, notif); 
} 

public void removeServiceFromForeground() { 
    if (notif != null && mNotificationManager != null) { 
     notif.tickerText = getText(R.string.location_service_stopping); 
     mNotificationManager.notify(notificationID, notif); 
    } 
    stopForeground(true); 
} 

Я запуск и остановку этого в onConnected() и onDisconnected() методах моего Service.

В новых версиях Android все нормально, и я не получаю ошибки, но в 2.3.4 я получаю ошибку:

FATAL EXCEPTION: main 
android.app.RemoteServiceException: Bad notification for startForeground: 
java.lang.IllegalArgumentException: contentIntent required: pkg=com.mycomp.app id=678567400 
notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x40) 

После прочтения на SO об этом, я полагаю, мне нужно, чтобы обеспечить contentIntent когда пользователь удаляет уведомление? Является ли это нормальным для моего Service? Не могу ли я просто вернуть пользователя к моему основному Activity?

ответ

4

I assume I need to provide a contentIntent for when a user taps the notification?

Видимо да. Я не помню, как пытался показать Notification sans contentIntent, но это, безусловно, похоже на то, что предлагает ошибка.

Is this normal to set within my Service?

Обычно вы обеспечиваете contentIntent, чтобы позволить пользователю действовать на Notification. В случае startForegound() он должен направить пользователя где-нибудь, где они смогут контролировать поведение службы (например, для остановки службы музыкального проигрывателя).

Couldn't I just return the user to my main Activity?

Независимо от того, что плавает ваша лодка и радует ваших пользователей, не обязательно в порядке важности.

+0

Я бы просто хотел вернуть моего пользователя к основной «Деятельности» моего приложения, в котором они могли остановить обновления местоположения. Как я даже ссылаюсь на свою «активность» из моей «службы»? –

+0

@NicHubbard: «Как мне даже ссылаться на мою активность с моей службы?» - вы не «ссылаетесь на [свою] активность», по крайней мере, не на то, как я буду использовать термин «ссылка». Вы создаете «PendingIntent», который приведет пользователя к этой активности. См. Http://developer.android.com/guide/topics/ui/notifiers/notifications.html и http://developer.android.com/training/notify-user/index.html – CommonsWare

0

Вы не должны пытаться активировать свою деятельность или перейдите на страницу any Активность с человека. В общем, вы не должны пытаться запустить Activity, если вы не вызываете startActivity или startActivityForResult, чтобы перейти от одного действия к другому. Кроме того, вы не должны пытаться запустить другое действие, если пользователь не попросит его запустить. Вы не хотите подталкивать пользователей, не позволяя им контролировать свой рабочий процесс; это модель UX, которая заставит пользователей ненавидеть вас.

Именно поэтому здесь есть уведомления и PendingIntents. Когда что-то в вашем Сервисе требует внимания пользователя, отправьте уведомление. Когда пользователь готов справиться с ситуацией, он или она могут щелкнуть уведомление, чтобы вернуться к Activity в вашем приложении. Если пользователь находится в середине какой-либо другой задачи, когда вы публикуете уведомление, вы позволяете пользователю завершить работу.

startForeground() используется, чтобы поставить службу в «высокий» приоритет, где система не сможет ее остановить. Он используется для запуска таких сервисов, как музыкальные проигрыватели, где пользователь хочет, чтобы Служба продолжала работать в большинстве случаев. Уведомление требуется для startForeground(), поскольку правила состоят в том, что вы не можете запустить службу переднего плана, не уведомляя пользователя о постоянном сообщении. В прошлом некоторые разработчики обошли это требование уведомления с помощью трюка: они предоставили уведомление без значка. Система не отображает уведомления, которые не имеют значков, поэтому служба переднего плана была «скрыта» от пользователя. Это отверстие заполнено; если вы попытаетесь сделать это с уведомлением, отправленным в startForeground(), система предоставит вам значок.

+0

Спасибо. Я понимаю, что я не должен ходить в «Активность из службы». Я был просто смущен тем, как использовать намерение в уведомлении, которое используется для startForeground(). –

Смежные вопросы