3

3 つのアクティビティ (メニュー、設定、ランキング リスト) が 1 つのバックグラウンド ミュージックを必要とするシンプルなゲームを開発しています。たとえば、ユーザーがメニューを離れて設定に戻った場合でも、バックグラウンドでスムーズに再生する必要があります。

そのために、完璧に機能するサービスを作成しました。大きな問題が 1 つだけあります。アプリを閉じても (ユーザーがホーム ボタンを押すなど)、音楽の再生が停止しません。

onDestroy、onStop、onPause を試しましたが、問題は解決しません。

サービス:

package com.android.migame;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;

public class Meni_music extends Service implements OnCompletionListener {

    private static final String TAG = null;
    MediaPlayer player;

    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.menu);
        player.setLooping(true); // Set looping
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return 1;
    }

    public IBinder onUnBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onDestroy() {
        player.stop();
        player.release();
        stopSelf();
    }

    @Override
    public void onLowMemory() {
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
    }
}

メニュー:

package com.android.migame;

    import android.app.Activity;
    import android.app.ActivityManager;

    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;

    public class Meni extends Activity {

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

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            setContentView(R.layout.meni);

            startService(new Intent(Meni.this,Meni_music.class));

        }

        @Override
        protected void onPause() {
            super.onPause();
        }

        @Override
        protected void onResume() {
            super.onResume();
        }

}
4

8 に答える 8

2

同様の要件がありましたが、これを解決する方法は次のとおりです。

  • を実装するクラスを作成し、Application.ActivityLifecycleCallbacksアプリケーションregisterActivityLifecycleCallbacksonCreate メソッドに登録します。このクラスは、アクティビティが一時停止または再開されるたびに通知されます。

  • このクラスでアクティブなアクティビティの数を維持します。0 から開始し、再開されたアクティビティごとに 1 を加算し、一時停止されたアクティビティごとに 1 を減算します。実際には、カウンターは常に 0 または 1 になります。

  • メソッドで、カウンターをデクリメントした後、onActivityPausedカウントがゼロかどうかを確認します。アクティビティが一時停止されてから次のアクティビティが再開されるまでの間に短い時間があり、その間はカウントがゼロになることに注意してください。onActivityPaused から妥当な時間待機した後でもカウントがゼロの場合、アプリケーションは完全にバックグラウンドに移行しているため、サービスを停止する必要があります。

于 2013-05-28T01:35:08.860 に答える
1

アクティビティ クラスで関数の外側を宣言し、Intentこのクラス内でサービスを停止し、次のように stop または ondestroy を呼び出します。

 public class Meni extends Activity {
     private Intent i=new Intent();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
     WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     setContentView(R.layout.meni);
     i=new Intent(Meni.this,Meni_music.class);
     startService(i);
 }

  @Override
  protected void onDestroy() {
    stopService(i);
    super.onDestroy();
}

 @Override
 protected void onStop() {
stopService(i);
super.onStop();
 }
}
于 2013-05-29T03:05:30.193 に答える
1

メニュー アクティビティが再開したときにサービスを開始し、アクティビティが停止したときにサービスを停止します。したがって、Menu アクティビティは次のようになります。

package com.android.migame;

    import android.app.Activity;
    import android.app.ActivityManager;

    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ImageView;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;

    public class Meni extends Activity {

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

            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            setContentView(R.layout.meni);
        }

        @Override
        protected void onPause() {
            super.onPause();
            stopService(new Intent(Meni.this,Meni_music.class));
        }

        @Override
        protected void onResume() {
            super.onResume();
            startService(new Intent(Meni.this,Meni_music.class));
        }
}
于 2013-05-18T20:12:33.340 に答える
1

サービスを使用しないバックグラウンド ミュージック:

http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

于 2013-06-01T11:21:11.920 に答える