Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • Android. Service. Службы

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

    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaMetadataRetriever;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.IBinder;

    public class service extends Service{
    static String str;
    MediaPlayer media = new MediaPlayer();
    MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();

    @Override
    public IBinder onBind(Intent arg0) {return null;}
    @Override
    public void onCreate() {
    super.onCreate();
    media = MediaPlayer.create(this,R.raw.arena);



    Uri mediaPath = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.arena);
    metaRetriever.setDataSource(getApplicationContext(), mediaPath);
    str = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)+"kb/s"
    + " \n \n" +metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)+" - "+
    metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)+" : "+
    (Double.toString((Double.parseDouble(metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION))/
    1000/60))).substring(0,4);
    media.start();

    }

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

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button start = (Button) findViewById(R.id.start);
    Button stop = (Button) findViewById(R.id.stop);
    final Intent intent = new Intent(MainActivity.this,service.class);

    final TextView textView=(TextView)findViewById(R.id.textView);


    start.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view){
    startService(intent);
    textView.setText(service.str);
    }
    });

    stop.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v){
    stopService(intent);
    }
    });

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

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

    Читайте больше в категории: Mobil App

    2016-08-13 09:23:49



    Другие статьи:

    Maya. Альфа канал и UV координаты

    Java. Наследование, доступ к переменным класса

    WinAPI. Button ( Кнопка ).

    PHP. Типовые команды MySQL

    WinAPI. Кнопки Управления Графиком функций.

    Maya. Карта рельефа Bump

    JavaScript. Создание простой Галереи изображений

    JavaScript. Создание, поиск и удаление элементов

    Maya. Операция Fill Hole

    STM32. Режим альтернативной функции