2014-04-07 10 views
8

पर निर्भर करता है कि मेरे पास कुछ गतिविधियां और एक इरादा सेवा है जो जीसीएम आने वाले संदेशों को संभालती है।एंड्रॉइड जीसीएम: ऐप दृश्यमान है या नहीं

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

मैं इस व्यवहार को बदलना चाहता हूं कि यदि ऐप दृश्यमान है (कोई गतिविधि अग्रभूमि में है), अधिसूचना के बजाय एक संवाद संदेश दिखाया गया है (उपयुक्त कार्रवाई के साथ)।

कोई विचार यह कैसे कार्यान्वित किया जाए?

2 विचार है लेकिन उनमें से कोई एकदम सही है: आवेदन में हर गतिविधि के

  • रखें ट्रैक, अगर गतिविधि दिखाई दे रहा है, अधिसूचना नहीं दिखा, लेकिन गतिविधि के लिए कोई लक्ष्य भेजा (अच्छा समाधान नहीं)
  • प्रत्येक गतिविधि के ऑनस्यूम/ऑन पॉज़ में दूसरे प्रसारण रिसीवर को पंजीकृत/अनधिकृत करें, आने वाले जीसीएम प्रसारण को "पकड़ें" (मुझे यकीन नहीं है कि यह संभव है)।

कोई अन्य समाधान?

उत्तर

1

मैंने इसका परीक्षण नहीं किया, लेकिन दस्तावेज़ कहते हैं कि आप प्रत्येक कार्य के लिए number of running activities प्राप्त कर सकते हैं।

प्रयास वर्तमान में चल रहे कार्यों के बीच आपके आवेदन का काम लगता है:

नोट::

ActivityManager acitivityManager = (ActivityManager) 
    context.getSystemService(Context.ACTIVITY_SERVICE); 
// Get the top of running tasks, limit by 100 
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100); 
for (RunningTaskInfo taskInfo : tasks) { 
    if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) { 
     if (taskInfo.numRunning > 0) { 
      // Show dialog 
     } else { 
      // Show notification 
     } 
     break; 
    } 
} 

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

तो इसे अपने जोखिम पर उपयोग करें।


यह भी जांचें कि क्या जीसीएम प्रसारण ordered हैं। यदि ऐसा है, तो आप प्रत्येक गतिविधि में अन्य लोगों के साथ अपने डिफ़ॉल्ट BroadcastReceiver "ओवरराइड" कर सकते हैं। IntentFilter एस के priority के साथ बस खेलें।जब BroadcastReceiver उच्च प्राथमिकता वाले संदेश को प्राप्त करता है, तो यह abort हो सकता है कि यह आगे प्रसार हो। आपके आवेदन के लिए इसका मतलब है कि जब कुछ Activity चल रहा है, तो यह रिसीवर पंजीकृत करता है जो संवाद और प्रसारण प्रसारण दिखाता है। यदि कोई गतिविधि सक्रिय नहीं है, तो आपका डिफ़ॉल्ट रिसीवर अधिसूचना दिखाता है।

+0

मैंने आपके द्वारा उल्लिखित कारणों के कारण पहले समाधान का उपयोग नहीं करना चाहता था। दूसरा समाधान promissiong प्रतीत होता है, मैं इसे देखता हूं – kmalmur

+0

जीसीएम प्रसारण वास्तव में आदेश दिया जाता है! धन्यवाद – kmalmur

3

सम्भावित समाधान (विचार 1): अपने एप्लिकेशन पीठ या अग्रभूमि चल रहा है कि क्या

का पता लगाने के लिए, आप बस onPause में एक बूलियन सेट कर सकते हैं/onResume:

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

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

जब आप एक शुरू एक अधिसूचना से नया इरादा इस विधि को बुलाया जाता है: (यदि आप सिंगलटॉप का उपयोग कर रहे हैं), बुलियन के साथ आप यह निर्धारित कर सकते हैं कि ऑन न्यूंटेंट विधि में क्या करना है।

@Override 
protected void onNewIntent (Intent intent){ 
    if(runningOnBackground){ 
    //do this 
    } 
    else{ 
    //do that 
    } 
} 

उम्मीद है कि यह मदद करता है!

+0

अच्छी तरह से, वास्तव में मैं इससे बचने की कोशिश कर रहा था। यदि आपके पास कुछ गतिविधियां हैं, तो कोड जटिल हो जाता है और गतिविधियों को स्विच करते समय भी एक संक्रमण होता है। यदि इस स्थिति के दौरान धक्का आता है, तो इसे ठीक से संभाला नहीं जा सकता है। – kmalmur

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