curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

Androidアプリで画面遷移してもBGMが鳴り続けるようにしてみた。

 

お疲れ様です。高橋です。

先日無事にDAWで楽曲を作成してandroidアプリから再生出来ましたが、その時の宿題だった「画面遷移すると音楽が止まってしまう」問題を解決することが出来ました。

普通Androidアプリの画面遷移は、画面操作に関する様々なメソッドが最初から備わっているandroid.app.ActivityというClassをexntedsして、オープニング画面やオプション設定画面、メニュー画面、メイン画面等、様々なゲームに必要な画面を構築し、その間のデータのやりとりを、Intentという仕組みを使って、元画面から先画面にSerializableをImplementsしたオブジェクトをIntent.putExtraし、先画面では元画面からIntent.getSerializableExtraします。

解りやすく絵にすると、多分こんな感じ。

02

 

が、楽曲の再生、楽曲の変更、停止、といったオブジェクト(android.media.MediaPlayerといいます)をトップの画面で生成したら、その後そのオブジェクトを引き継ぐのが面倒なのです。

私は本当に面倒な事が大嫌いです。同じ事を2回言う事すらも大嫌いですし、1回出した結論を変えるのも大嫌いですし、一度書いたコードを修正するのはこの世で一番嫌いな事です。

というわけでググってみた

「activity mediaplayer」や「mediaplayer 遷移」等でググって見ると、私が求めていた答えが出てきました。

MediaPlayerで再生したファイルをintentで遷移させた先でstopさせる その1

↑が一番参考になりました。というかコードをそのままコピペして少しだけ修正です。

私はオープニング画面とメイン画面とで楽曲を分けたかったので、このようにしました。

01

 

音楽のとこだけ抜き出すと、下のような感じ。

 

03

 

サンプルコードは下記の通りです。

package jp.curious4dev.mediaplayerwithmultiactivity;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;

public class BaseActivity extends Activity {
    static protected MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (mp == null) {
            mp = MediaPlayer.create(this, R.raw.opening);
            mp.setLooping(true);
        }

    }

    protected void mpChange(int intSong) {

        mp = MediaPlayer.create(this, intSong);
        mp.setLooping(true);
    }

    protected void mpStart() {
        if (!mp.isPlaying()) {
            mp.start();
        }
    }

    protected void mpStop() {
        if (mp.isPlaying()) {
            mp.stop();
        }
    }

}
package jp.curious4dev.mediaplayerwithmultiactivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends BaseActivity {

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

        findViewById(R.id.button1).setOnClickListener(button1);

        mpStart();

    }

    OnClickListener button1 = new OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SubActivity.class);
            startActivity(intent);
        }
    };

}

package jp.curious4dev.mediaplayerwithmultiactivity;

import android.os.Bundle;

public class SubActivity extends BaseActivity {

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

        mpStop();
        mpChange(R.raw.main);
        mpStart();
    }

}

 

 

以上、よろしくお願い致します。

 - アプリ開発

  関連記事

遅刻の言い訳アプリをリリースしてみた。

お疲れ様です。高橋です。 2/20あたりから、「合理的な遅刻の言い訳生成アプリ。 …

androidアプリから総務省APIをコールしてみる

お疲れ様です。高橋です。 androidアプリから総務省APIをコールする事に成 …

遅刻の言い訳提案システム 稼働初日

お疲れ様です。高橋です。 先日まで微調整を重ねてきた「遅刻の言い訳提案システム」 …

遅刻の言い訳提案システム 稼働四日目

お疲れ様です。高橋です。 本日も遅刻の言い訳提案システムのデータの分析と改善のた …

Androidで8bitサウンドをモノフォニックな感じで実装してみた。

お疲れ様です。高橋です。 Arduino+YMZ294で、8bitサウンドがマイ …

遅刻の言い訳提案システム 稼働三日目 ~大失敗~

お疲れ様です。高橋です。 三日目を迎えた遅刻の言い訳提案システムですが、重大なバ …

Androidアプリ上でLINEみたいな吹き出しでTextを囲んで表示してみた。

お疲れ様です。高橋です。 AndroidでLINEみたいにテキストの周りを吹き出 …

広告IDが取得出来なかった理由がわかってきた。かな?

お疲れ様です。高橋です。 しばらく前からめぼしい更新を停止していた「カナかな?」 …

DLリンク付き言い訳提案システムとDL数の関係について

お疲れ様です。高橋です。 DLリンク付きの言い訳提案システムを1週間稼働させ、そ …

街頭インタビュー 背景人物切り替え機能の実装

お疲れ様です。高橋です。 本日は、背景人物を切り替える機能を実装しました。とりあ …