Developer от Бога

DV

четверг, 6 июля 2017 г.

Android. Service. Службы



Service - службы, программы которые работают в фоновом режиме, без графического интерфейса. Service - может работать даже после закрытия компонента которое запустило. Часто при некоторых ошибках в коде, компонент может быть заверешен, но вызванный им Service будет продолжать свою работу.
Согласно документации, Service может принимать две формы: Запущенную - startService() , который будет работать пока не сделает свою задачу. Вторая форма - Привязанная, запускается через bindService() и предлагает интерфейс клиент-сервер, с возможностью взаимодействия с компонентом или несколькими компонентами. Привязанная служба завершает свою работу после отмены привязки последнего компонента к ней.
В данном примере программы показан метод воспроизведения музыки с помощью Service.
Первое что нужно сделать - создать класс, наследованный от Service, в котором будет описывать фоновую задачу :

  1. import android.app.Service;
  2. import android.content.Intent;
  3. import android.media.MediaMetadataRetriever;
  4. import android.media.MediaPlayer;
  5. import android.net.Uri;
  6. import android.os.IBinder;
  7. public class service extends Service{
  8. static String str;
  9. MediaPlayer media = new MediaPlayer();
  10. MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
  11. @Override
  12. public IBinder onBind(Intent arg0) {return null;}
  13. @Override
  14. public void onCreate() {
  15. super.onCreate();
  16. media = MediaPlayer.create(this,R.raw.arena);
  17. Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.arena);
  18. metaRetriever.setDataSource(getApplicationContext(), mediaPath);
  19. str = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)+"kb/s"
  20. + " \n \n" +metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)+" - "+
  21. metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)+" : "+
  22. (Double.toString((Double.parseDouble(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION))/
  23. 1000/60))).substring(0,4);
  24. media.start();
  25. }
  26. @Override
  27. public void onDestroy() {
  28. media.stop();
  29. media=null;
  30. super.onDestroy();}
  31. }  

MediaMetadataRetriever - класс позволяющий извлекать метаданные воспроизводимых файлов - Название песни, Исполнителя, длину трека и многое другое. В примере - воспроизводимая песня лежит в папке res/raw, но в реальности плеер должен искать музыку в папках устройства. Больше всего проблем может возникнуть с извлечением длинны аудиофайлах, которое по умолчанию возвращает длину в миллисекундах. В примере длинна деленная на 1000/60 , несколько раз конвертирована из числа в строку, и в конце функцией substring(0,4) показывает только первые 3 символа (минуты и секунды).
Интерфейс Service содержит несколько функций: IBinder onBind(), и нужные нам onCreate() - в котором идет программа после запуска сервиса и onDestroy() - программа которая выполнится после команды о закрытии сервиса.
Класс MediaPlayer media - принимает нужный аудиофайл , и воспроизводится media.start().
В главном классе содержатся строки создания сервиса - Intent, ранее изученный который создает кроме активностей и сервисы, одним из параметров его -service.class который был создан ранее. Обработчики кнопок - запускают процесс работы сервиса:

  1. import android.content.Intent;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.TextView;
  7. public class MainActivity extends AppCompatActivity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. Button start = (Button) findViewById(R.id.start);
  13. Button stop = (Button) findViewById(R.id.stop);
  14. final Intent intent = new Intent(MainActivity.this,service.class);
  15. final TextView textView=(TextView)findViewById(R.id.textView);
  16. start.setOnClickListener(new View.OnClickListener() {
  17. public void onClick(View view){
  18. startService(intent);
  19. textView.setText(service.str);
  20. }
  21. });
  22. stop.setOnClickListener(new View.OnClickListener() {
  23. public void onClick(View v){
  24. stopService(intent);
  25. }
  26. });
  27. }
  28. } }
  29.  

Третье что нужно сделать, это внести дополнения в файл Манифест, и зарегистрировать там нужный сервис, иначе Android может воспринять запуск сервиса как сторонний вредоносный код. В файле указывается имя класса который работает как сервис:


<service android:name=".service"></service>


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

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