2010-09-16 9 views
6

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

यह सेवा डेटा के लिए सर्वर को मतदान करने और कुछ मानदंडों को पूरा करते समय अलर्ट अधिसूचनाएं भेजने के लिए ज़िम्मेदार है। मैं नहीं चाहता कि गतिविधि दृश्यमान होने पर इन सूचनाओं को भेजने के लिए सेवा करे।

क्या किसी विशेष गतिविधि की स्थिति जानने के लिए सेवा का कोई तरीका है? विशेष रूप से एक गतिविधि जो इसके लिए बाध्य है?

अनुमति समस्या के निवारण के प्रकट साथ अद्यतन:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.interact.listen.android.voicemail" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".MyAppName" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".MyObjectDetails"/> 
     <service android:enabled="true" android:name=".MyService" /> 
     <receiver android:name=".MyReceiver"> 
      <intent-filter> 
       <action android:name="com.foo.bar.EVENT"/> 
      </intent-filter> 
     </receiver> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
</manifest> 

त्रुटि मैं Logcat में हो रही है:

09-17 15:33:17.881: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to ProcessRecord{43928b40 223:com.foo.bar.myobject/10022} (pid=223, uid=10022) requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022) 
09-17 15:33:48.901: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to com.foo.bar.myobject requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022) 

टास्क कि प्रसारण भेजता है:

@Override 
public void onStart(Intent intent, int startId) 
{ 
    super.onStart(intent, startId); 
    serviceHandler = new Handler(); 
    serviceHandler.postDelayed(myTask, 100L); 
    Log.d(TAG, "onStart()"); 
} 

class Task implements Runnable 
{ 
    public void run() 
    { 
     Log.i(TAG, "Getting myObjects..."); 
     getMyObjects(); 
     Bundle bundle = new Bundle(); 
     bundle.putLongArray("ids", getIdsToUpdate()); 

     Intent i = new Intent(); 
     i.setAction(UPDATE_ACTION_STRING); 
     i.putExtras(bundle); 

     sendOrderedBroadcast(i, UPDATE_ACTION_STRING); 

     serviceHandler.postDelayed(this, 30000L); 
     } 
    } 
} 

उत्तर

8

नौकरिक के लिए कोई रास्ता है ई किसी विशेष गतिविधि की स्थिति जानने के लिए? विशेष रूप से एक गतिविधि है कि इसके लिए बाध्य है?

आप किसी प्रकार की कॉलबैक प्रणाली को कार्यान्वित कर सकते हैं।

लेकिन समस्या को हल करने के लिए एक क्लीनर तरीका है। एक आदेशित प्रसारण का उपयोग करें। क्या गतिविधि में उच्च प्राथमिकता प्राप्तकर्ता है; कम-प्राथमिकता प्राप्तकर्ता में वृद्धि-अधिसूचना तर्क होना चाहिए। अधिसूचना को रोकने के लिए गतिविधि के रिसीवर कॉल abortBroadcast() पर कॉल करें। मेरे पास तकनीक के बारे में blog post है। इवेंट बस का उपयोग करें: ग्रीनबोट का इवेंटबस, LocalBroadcastManager, एक आरएक्स-आधारित इवेंट बस, या यहां तक ​​कि MutableLiveData। सेवा बस को एक संदेश पोस्ट करें। जब यूआई अग्रभूमि में है तो बस पर ईवेंट के लिए यूआई लेयर रजिस्टर करें। यदि कोई भी बस पर लगाए गए ईवेंट को उठाता है तो सेवा Notification बढ़ाएं।

+0

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

+0

@twilbrand: मुझे कोई जानकारी नहीं है। आप प्रसारण कैसे भेज रहे हैं? – CommonsWare

+0

मेरी रिमोट सेवा से। मेरे पास एक ऐसा कार्य है जो हर 30 सेकंड में चला जाता है। मैंने प्रश्न में कोड जोड़ा है। – twilbrand

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