2011-10-28 12 views
7

ठीक है, यह मेरी समस्या है। मेरे पास एक सेवा वर्ग है जहां मैंने पृष्ठभूमि में संगीत चलाने के लिए मीडिया प्लेयर बनाने में कामयाब रहे। यहाँ कोड है:पृष्ठभूमि संगीत एंड्रॉइड

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(); 
} 
} 

लेकिन जब मैं HOME, या BACK बटन पर क्लिक करें अब मैं समस्या है। यह अभी भी संगीत बजाता है। क्या कोई जानता है कि उस समस्या को कैसे हल किया जाए?

और यहां कोड है कि मैं इस सेवा को कक्षा में कैसे कॉल करता हूं जहां मैं संगीत खेलना चाहता हूं;

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

मुझे नहीं पता कि समस्या कहां है ... क्या आप हर समय पृष्ठभूमि में संगीत नहीं खेलना चाहते थे? – m0skit0

+0

मैं एप्लिकेशन चलाने के दौरान इसे हर समय खेलना चाहता हूं, लेकिन जब मैं होम बटन संगीत दबाता हूं तब भी खेलता है। – Zookey

उत्तर

22

यदि आप केवल अपने ऐप के लिए पृष्ठभूमि संगीत खेलना चाहते हैं, तो इसे अपने ऐप से लॉन्च किए गए थ्रेड में चलाएं/AsyncTask क्लास को अपने लिए करने के लिए उपयोग करें।

सेवाओं की अवधारणा पृष्ठभूमि में चलाना है; पृष्ठभूमि से, आमतौर पर इसका अर्थ होता है जब आपका ऐप यूआई विस्मय नहीं है। सच है, इसका उपयोग आपके जैसा ही किया जा सकता है (यदि आपको इसे रोकना याद है) लेकिन यह सही नहीं है, और यह उन संसाधनों का उपभोग करता है जिनका उपयोग नहीं करना चाहिए।

यदि आप अपने गतिविधि की पृष्ठभूमि पर कार्यों को छेड़छाड़ करना चाहते हैं, तो AsyncTask का उपयोग करें।

वैसे, onStart बहिष्कृत है। जब आप सेवाओं का उपयोग करते हैं, तो onStartCommand लागू करें।

अद्यतन:

मुझे लगता है कि इस कोड को आप के लिए काम करेंगे। इस वर्ग को जोड़ें (अपनी गतिविधि कक्षा में संलग्न)।

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; 
    } 

} 

अब, संगीत को नियंत्रित करने के लिए, इसे अनामित रूप से बनाने के बजाय अपनी पृष्ठभूमिसाउंड ऑब्जेक्ट को सहेजें। एक क्षेत्र के रूप में यह घोषित अपनी गतिविधि में:

BackgroundSound mBackgroundSound = new BackgroundSound(); 

अपनी गतिविधि के onResume विधि पर, यह शुरू:

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

और अपनी गतिविधि के onPause पद्धति पर, इसे रोकने:

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

यह काम करेगा।

+0

क्या आप मेरे कोड को ठीक कर सकते हैं जो आपने कहा था? – Zookey

+0

अब क्या होगा .. कुछ मिनटों में बीमार संपादित करें। – Jong

+0

बस एक सवाल है। क्या मुझे नई कक्षा पृष्ठभूमि साउंड बनाने की ज़रूरत है? या इसे BackgroundSoundService क्लास के अंतर्गत रखें, या इसे मेरे मुख्य गतिविधि वर्ग के अंदर रखें? – Zookey

0

निश्चित रूप से, आपकी सेवा पृष्ठभूमि में चलती है और पृष्ठभूमि पर जाने पर आपको इसे अपनी गतिविधि से मैन्युअल रूप से रोकना होगा।

+2

मैन्युअल रूप से इसे कैसे रोकें? – Zookey

0

हाँ, जब आप घर बटन दबाते हैं तो आपको सेवा को रोकना चाहिए। OnPause() {} ओवरराइड विधि में आपको संगीत सेवा को रोकना चाहिए। और OnDestroy() विधि में सेवा के अंदर कृपया मीडिया प्लेयर को रोकें। तो अब, होम कॉल दबाने पर रोकें और रोकें() -> सेवा बंद कर देता है और ऑनडिस्ट्रॉय को सेवा में निष्पादित किया जाता है और odestroy() में mediaplayer बंद हो जाता है और आपकी समस्या ठीक हो जाती है। अपने स्टॉप पर विधि में कोड नीचे

0

लिखने:

प्रणाली।बाहर निकलने के (0);

यह आपके मीडिया प्लेयर को समाप्त जब आप प्रेस वापस/होम बटन या करीबी आवेदन

0

घर या वापस प्रेस पर पृष्ठभूमि संगीत को रोकने के लिए निम्नलिखित की कोशिश करेंगे।

@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 बस बहुत छोटी क्लिप के लिए अच्छे हैं, लेकिन अगर यह एक संगीत फ़ाइल है आप जैसी समस्याओं का सामना करना पड़ेगा: आप को रोकने/बीच में संगीत को रोकने के लिए सक्षम नहीं होगा

  • । मेरे लिए यह एक असली समस्या है।

यहाँ AsyncTasks के बारे में एंड्रॉयड डेवलपर्स पेज से कुछ लाइन है

AsyncTasks आदर्श कम कार्यों के लिए इस्तेमाल किया जाना चाहिए (कम से कुछ ही सेकंड सबसे।) आप धागे लंबी अवधि के लिए चालू रखने के लिए की जरूरत है समय, यह अत्यधिक अनुशंसा की जाती है कि आप द्वारा प्रदान किए गए विभिन्न एपीआई का उपयोग java.util.concurrent पैकेज जैसे निष्पादक, थ्रेडपूलएक्सएटर और फ़्यूचरटास्क द्वारा प्रदान किए गए विभिन्न API का उपयोग करें।

तो वर्तमान में मैं समाधान खोजने के बाद अन्य विकल्पों में देख रहा हूं और उत्तर अपडेट कर रहा हूं।

0

onDestroy() विधि में player.stop() डालने का प्रयास करें। यह मदद करनी चाहिए।

संबंधित मुद्दे