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>
Комментариев нет:
Отправить комментарий