ホーム > カテゴリ > Java・Android >

バックグラウンド処理(サービス) [Android Studio]

Android Studioの使い方(目次)

目次

1. 作るもの
2. 画面設計
  2-1. メイン
  2-2. サービス
3. コーディング

1. 作るもの

再生ボタンを押すとサービスを開始します。サービスはMediaPlayerを使用して通知音を繰り返し再生します。停止ボタンを押すとサービスを停止して再生も終了します。

2. 画面設計

2-1. メイン

Buttonを2個配置します。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="再生"
        app:layout_constraintEnd_toStartOf="@+id/button2"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止"
        app:layout_constraintBottom_toBottomOf="@+id/button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="@+id/button" />

</android.support.constraint.ConstraintLayout>

2-2. サービス

[新規][サービス]で「サービス」を選択します。

クラス名を「MyService」でエキスポート済みを「オフ」にする。

サービスをプロジェクトに追加するとapp\manifests\AndroidManifest.xmlに次のコードが自動で追記されます。

<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="false"></service>

これで画面設計は完了です。次はコーディングです。

3. コーディング

[MainActivity.java]

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

public class MainActivity extends AppCompatActivity {

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

        // ボタンの制御
        findViewById(R.id.button).setEnabled(true);
        findViewById(R.id.button2).setEnabled(false);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // サービスの開始
                Intent intent = new Intent(MainActivity.this,MyService.class);
                startService(intent);

                findViewById(R.id.button).setEnabled(false);
                findViewById(R.id.button2).setEnabled(true);
            }
        });

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,MyService.class);
                stopService(intent);

                findViewById(R.id.button).setEnabled(true);
                findViewById(R.id.button2).setEnabled(false);
            }
        });
    }
}

[MyService.java]

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

public class MyService extends Service {

    private MediaPlayer player;

    @Override
    public void onCreate() {
        player = new MediaPlayer();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // メディアの音量調整シークバーを表示する
        // ※今回は初期値を最大音量にしています。
        AudioManager manager = (AudioManager)getSystemService(MyService.this.AUDIO_SERVICE);;
        manager.setStreamVolume(AudioManager.STREAM_MUSIC,
                                manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                                AudioManager.FLAG_SHOW_UI);

        // 通知音
        Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        try {
            // 通知音を繰り返し再生する
            player.setDataSource(MyService.this, uri);
            player.setLooping(true);
            player.prepare();
            player.start();
        }catch (Exception e){
            e.getStackTrace();
        }
        
        // START_NOT_STICKY
        //   サービスが終了されてもサービスを再起動しない(常にサービスを起動しない)
        // ※ココの設定次第で常にサービスを起動する事が可能です。
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        if(player.isPlaying()) {
            player.stop();
        }
        player.release();
        player = null;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

参考URL(Google)

Service





関連記事



公開日:2018年05月22日
記事NO:02662