28

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

मुझे क्या समस्याएं आ रही हैं यह सुनिश्चित कर रही है कि जब कोई भी कार्रवाई क्लिक की जाती है, तो कार्रवाई से संबंधित प्लेबैक नियंत्रण ट्रिगर होता है, और ठीक है, मुझे बिल्कुल यह नहीं पता कि यह कैसे किया जाए। मैंने एंड्रॉइड अधिसूचना की खोज की: http://developer.android.com/guide/topics/ui/notifiers/notifications.html लेकिन यह अधिसूचना कार्यों पर बहुत अधिक जानकारी को स्पष्ट या समर्पित नहीं करता है। नोट:: नीचे वर्णित निम्नलिखित पैकेज के तहत लिखा है कोड के सभी: com.deadpixels.light

यहाँ उदाहरण के लिए एक सरल कार्रवाई (जो अधिसूचना पर "अगला" बटन क्लिक के साथ संबद्ध किया जाना चाहिए है .player और गतिविधि कहा जाता है: PlayerActivity

public void nextSong() { 
    if (position == songs.size() -1) { 
     Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show(); 
     if(mPlayer.isPlaying()) { 
      return; 
     } 
     else { 
      buttonPlay.setImageResource(R.drawable.button_play); 
     } 
     return; 
    } 
    else { 
     position++; 
     playSong(songs.get(position)); 
    } 
} 

यहाँ मैं करने की कोशिश की क्या है:

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0); 

NextIntent के लिए कार्रवाई कहां है:

public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong"; 

और फिर मैं अधिसूचना में जोड़ देते हैं addAction() के माध्यम से:

mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent); 

तुम लोग पता है कि मैं और क्या कोशिश कर सकते हैं? मैंने ऊपर जो बताया है उसका उपयोग करना कुछ भी नहीं है, अधिसूचना दिखाती है, और इसमें तीन एक्शन बटन हैं, लेकिन उन पर क्लिक करने से मेरे लिए कुछ भी नहीं है।

एक बिंदु पर मैंने सोचा कि शायद मैंने एक्शन नामों के साथ इरादे फ़िल्टर जोड़े हैं, लेकिन फिर मैंने सोचा, ठीक है, वे सभी एक ही नामस्थान पर हैं, मुझे क्यों चाहिए?

उत्तर

43

मैंने प्रसारण का उपयोग करके इस समस्या को हल किया है।

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0); 

फिर, अपने Activity के भीतर एक BroadcastReceiver रजिस्टर: उदाहरण के लिए, एक प्रसारण कि अगले गीत के लिए अग्रिम भेजने के लिए, आप निम्न का उपयोग कर सकते

IntentFilter filter = new IntentFilter(); 
filter.addAction(KEY_NEXT); 
// Add other actions as needed 

receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(KEY_NEXT)) { 
      nextSong(); 
     } else if (...) { 
      ... 
     } 
     ... 
    } 
} 

registerReceiver(receiver, filter); 

आप एक सेवा उपयोग कर रहे हैं पृष्ठभूमि प्लेबैक प्रबंधित करने के लिए, फिर आप गतिविधि के बजाय सेवा में BroadcastReceiver पंजीकृत करना चाहेंगे। receiver उदाहरण कहीं भी स्टोर करना सुनिश्चित करें ताकि गतिविधि या सेवा बंद होने पर आप इसे अनधिकृत कर सकें।

+1

रिसीवर इंस्टेंस को स्टोर करना सुनिश्चित करें .. स्टोर कहां? –

+0

@anonymous अपनी गतिविधि या सेवा में इसका संदर्भ रखें। – acj

+1

आप ब्रॉडकास्ट रिसीवर को मैनिफेस्ट में क्यों पंजीकृत नहीं करते हैं और अलग वर्ग के रूप में बनाते हैं? – streamride

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