четверг, 12 января 2012 г.

Бессмертный сервис

Иногда Вы включаете музыку в фоновом режиме, а сами, например, пишите смс или общаетесь в чате с друзьями. Так вот знайте, что Android убивает все ненужные сервисы и приложения, а в случае если пользователю потребуется снова отобразить это приложение, система восстанавливает его или создает заново. Но это не действует на сервис который проигрывает музыку! Хотите знать почему?! Система может убить этот сервис только в крайнем случае, таком как нехватка памяти. Ладно, ближе к делу. У нас есть сервис, который будет работать до тех пор пока его не отключит сам пользователь (а не система). Для этого надо указать системе, что он является Foreground-сервисом, а не Background (как по умолчанию).
Все что для этого нужно сделать, это переопределить метод onStartCommand и в нем вызвать метод startForeground с двумя параметрами.

private static int NOTIFICATION_ID = 1;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
                   startForeground( NOTIFICATION_ID,  ??? );
        }

Первый параметр - это уникальный идентификатор, по которому система будет определять ваше оповещение.
Со вторым параметром сложнее. Это переменная на само оповещение. Мы должны его создать для начала:
         int icon = R.drawable.icon;         
         long when = System.currentTimeMillis();

         Notification notification = new android.app.Notification(icon, "Hello world!!!", when); 
         //Создание намерения с указанием класса вашей Activity, которую хотите вызвать при           нажатии на оповещение.        
         Intent notificationIntent = new Intent(this, yourActivityClass);
         notificationIntent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);        
         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);  
         notification.setLatestEventInfo(context, "TITTLE", "Text", contentIntent); 

Оповещение готово! Теперь передаем его в качестве второго параметра.
startForeground( NOTIFICATION_ID, notification);

Осталось лишь одно. Как сказать системе что наш сервис теперь "смертный" и его можно убить? Еще проще:  this.stopForeground(false).
Здесь параметром является булева переменная, которая спрашивает убирать оповещение после остановки сервиса или нет.
Вот и все!

P.S. 1. Все это работает начиная с версии 2.0.
        2. Метод startForeground обязательно требует оповещение (т.е. null передать не получиться) Сделано это для того, чтобы пользователь всегда знал, что сервис работает. Иными словами сервис, который будет инкогнито, сделать не получиться. :)


Комментариев нет:

Отправить комментарий