2011-10-28 38 views
7

Okey, đây là vấn đề của tôi. Tôi có một lớp dịch vụ nơi Ive quản lý để tạo trình phát đa phương tiện để phát nhạc trong nền mọi lúc. Đây là mã:Nhạc nền Android

package com.test.brzoracunanje; 
import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 

public class BackgroundSoundService extends Service { 
private static final String TAG = null; 
MediaPlayer player; 
public IBinder onBind(Intent arg0) { 

    return null; 
} 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
     player = MediaPlayer.create(this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(100,100); 
     player.start(); 
} 
@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

protected void onNewIntent() { 
    player.pause(); 
} 
} 

Nhưng bây giờ tôi có vấn đề khi tôi bấm vào HOME, hoặc BACK nút. Nó vẫn chơi nhạc. Có ai biết cách giải quyết vấn đề đó không?

Và đây là cách tôi gọi dịch vụ này trên lớp nơi tôi muốn phát nhạc;

Intent svc=new Intent(this, BackgroundSoundService.class); 
    startService(svc); 
+0

Tôi không thấy vấn đề ở đâu ... Bạn không muốn phát nhạc ở chế độ nền TẤT CẢ thời gian? – m0skit0

+0

Tôi muốn phát tất cả thời gian trong khi ứng dụng đang chạy, nhưng khi tôi bấm nút Home nhạc vẫn phát. – Zookey

Trả lời

22

Nếu bạn chỉ muốn phát nhạc nền cho ứng dụng của mình, hãy phát nó trong một chuỗi được khởi chạy từ ứng dụng của bạn/sử dụng lớp AsyncTask để làm điều đó cho bạn.

Khái niệm về dịch vụ là chạy trong nền; Theo nền, ý nghĩa thường là khi giao diện người dùng ứng dụng của bạn là KHÔNG THỂ xem được. Đúng, nó có thể được sử dụng giống như bạn có (Nếu bạn nhớ dừng nó) nhưng nó không đúng, và nó tiêu thụ tài nguyên bạn không nên sử dụng.

Nếu bạn muốn thực hiện các tác vụ trên nền hoạt động , hãy sử dụng AsyncTask.

Nhân tiện, onStart không còn được dùng nữa. Khi bạn sử dụng dịch vụ, hãy triển khai onStartCommand.

UPDATE:

Tôi nghĩ rằng mã này sẽ làm việc cho bạn. Thêm lớp này (Kèm theo lớp hoạt động của bạn).

public class BackgroundSound extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(1.0f, 1.0f); 
     player.start(); 

     return null; 
    } 

} 

Bây giờ, để kiểm soát nhạc, hãy lưu đối tượng BackgroundSound của bạn thay vì tạo đối tượng ẩn danh. Tuyên bố nó như là một lĩnh vực trong hoạt động của bạn:

BackgroundSound mBackgroundSound = new BackgroundSound(); 

On phương pháp onResume của hoạt động của bạn, hãy bắt đầu nó:

public void onResume() { 
    super.onResume(); 
    mBackgroundSound.execute(null); 
} 

Và trên phương pháp onPause của hoạt động của bạn, ngăn chặn nó:

public void onPause() { 
    super.onPause(); 
    mBackgroundSound.cancel(true); 
} 

này sẽ làm việc.

+0

Bạn có thể sửa mã của tôi để làm những gì bạn nói không? – Zookey

+0

Sẽ làm ngay bây giờ .. Sửa đổi trong vài phút. – Jong

+0

Chỉ một câu hỏi. Tôi có cần tạo lớp BackgroundSound mới không? hoặc đặt nó dưới lớp BackgroundSoundService, hoặc đặt nó bên trong lớp hoạt động chính của tôi? – Zookey

0

Chắc chắn, dịch vụ của bạn chạy ẩn và bạn phải ngừng hoạt động theo cách thủ công khi hoạt động sau nền.

+2

Cách dừng thủ công? – Zookey

0

có, bạn nên ngừng dịch vụ khi bạn nhấn nút home. Trong OnPause() {} phương thức ghi đè u nên dừng dịch vụ âm nhạc. Và bên trong dịch vụ trong phương thức OnDestroy() bạn hãy dừng trình phát media. Vì vậy, bây giờ, nhấn cuộc gọi gia đình onPause và onPause() -> dừng dịch vụ và OnDestroy được thực hiện trong dịch vụ và trong odestroy() các mediaplayer được dừng lại và vấn đề ur được cố định.

0

viết mã bên dưới vào phương pháp dừng của bạn:

hệ thống.thoát (0);

này sẽ chấm dứt media player của bạn khi bạn nhấn trở lại/nút home hoặc ứng dụng gần

0

Hãy thử sau để tắt nhạc nền tại HOME hoặc BACK báo chí.

@Override 
protected void onStop() { 
    super.onStop(); 
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager 
      .getRunningTasks(Integer.MAX_VALUE); 
    boolean isActivityFound = false; 

    if (services.get(0).topActivity.getPackageName().toString() 
      .equalsIgnoreCase(getPackageName().toString())) { 
     isActivityFound = true; // Activity belongs to your app is in foreground. 
    } 

    if (!isActivityFound) { 
     if (player != null && player.isPlaying()) { 
      player.release(); 
     } 
    } 
} 
1

AsyncTasks là tốt chỉ vì clip rất ngắn, nhưng nếu nó là một tập tin âm nhạc mà bạn sẽ phải đối mặt với các vấn đề như:

  • Bạn sẽ không thể dừng/tạm dừng nhạc ở giữa. Đối với tôi đó là một vấn đề thực sự.

Dưới đây là vài dòng từ trang nhà phát triển Android về AsyncTasks

AsyncTasks lý tưởng nên được sử dụng cho các hoạt động ngắn (một vài giây tại nhiều nhất.) Nếu bạn cần phải giữ cho chủ đề hoạt động trong thời gian dài trong thời gian , bạn nên sử dụng nhiều API khác nhau được cung cấp bởi gói java.util.concurrent như Executor, ThreadPoolExecutor và FutureTask.

Vì vậy, hiện tại tôi đang tìm kiếm các tùy chọn khác và cập nhật câu trả lời khi tôi tìm thấy giải pháp.

0

Thử chèn player.stop() vào phương thức onDestroy(). Nó sẽ giúp.