android विजेट/स्थानीय सेवा से एंड्रॉइड रिमोट सेवा(आईपीसी) को कैसे कॉल करें?



service widget (1)

मुझे अपने ही प्रश्न का उत्तर मिला। दूसरों के लिए चीजों को आसान बनाने के लिए, यहां समाधान है:

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

अब जो मुझे समझा नहीं था वह है कि आपके पास मेनिफेस्ट में एक सेवा की परिभाषा होगी - इंन्टर फ़िल्टर के साथ!

मान लें कि आपके एआईडीएल को आईरमेट सर्विस सेवा कहा जाता है, तो आपके पास एक क्लास है जिसे रिमोट सर्विस कहते हैं, जो इस तरह दिखता है:

public class RemoteService extends Service {
  public IBinder onBind(Intent intent) {
    Log.i("RemoteService", "onBind() called");
    return new RemoteServiceImpl();
  }
  /**
   * The IRemoteInterface is defined through IDL
   */
  public class RemoteServiceImpl extends IRemoteService.Stub {
    public void remoteDetonateBirthdayCake() throws RemoteException {
        //your code here
    }
  };
}

आपके एंड्रॉइड मैनिफेस्ट में, आप यह चाहते हैं:

<service android:name="RemoteService"> 
    <intent-filter>
        <action android:name="com.sofurry.favorites.IRemoteService"></action>
</intent-filter>
</service>

सेवा नाम पर ध्यान दें: यह "दूरस्थ सेवा" है, "IRemoteService" या "RemoteServiceImpl" नहीं है। आपको उस वर्ग के नाम की आवश्यकता होती है जो "सेवा" का विस्तार करती है, जिसका ऑन-अप पद्धति हम ओवरराइड करते हैं।

बात को पूरा करने के लिए, यहां क्लाइंट साइड पर कोड है- और हाँ यह कोड किसी अन्य सेवा के भीतर भी काम करता है, उदाहरण के लिए आपने अपने विजेट से शुरू किया;)

IRemoteService mService;
RemoteServiceConnection mConnection = new RemoteServiceConnection();
getApplicationContext().bindService(new Intent(IRemoteService.class.getName()), mConnection, Context.BIND_AUTO_CREATE);

... जहां RemoteServiceConnection समान श्रेणी हो सकती है:

class RemoteServiceConnection implements ServiceConnection {
    public void onServiceConnected(ComponentName className, 
        IBinder service ) {
        mService = IRemoteService.Stub.asInterface(service);
        isBound = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        isBound = false;
    }
};

और अब, आप कॉल करने के लिए स्वतंत्र हैं ..

mService.remoteDetonateBirthdayCake();

संक्षेप में: एंड्रॉइड मैनिफेस्ट में एक सर्विस स्टन्ज़ा सुनिश्चित करें, क्लास पर "नेम" सेट करें जो कि इसके ऑन-बिन्ंड विधि में वास्तविक कार्यान्वयन देता है, और आपको एक एक्टिविटी निश्चितता के साथ एक आशय फिल्टर भी होना चाहिए जो कि एआईडीएल इंटरफ़ेस

संकेत: यदि आप किसी एप से अलग एपीके के अंदर दूरस्थ सेवाओं को बुला रहे हैं, तो आशय फ़िल्टर में एक "श्रेणी" तत्व भी जोड़ें और इसे डिफॉल्ट पर सेट करें

मैं एक विजेट से लाइव वॉलपेपर को रिमोट करने की कोशिश कर रहा हूं। वे एक ही एपीके में हैं, लेकिन स्पष्ट रूप से अलग प्रक्रियाएं लाइव वॉलपेपर का एक "गतिविधि" कॉल करना मेरे लिए बहुत कम उपयोग है क्योंकि यह एक अलग प्रक्रिया है। विजेट में सरल बटन हैं, जब दबाए जाते हैं,

तो क्या (मुझे लगता है) मुझे आईपीसी और एआईडीएल की आवश्यकता है।

सबसे पहले मैंने वॉलपेपर पक्ष पर एआईडीएल बनाया, जिसने ठीक काम किया। इसमें कोई अतिरिक्त पैरामीटर नहीं के साथ तीन तरीके हैं लेकिन जब मैंने क्लाउडसाइड को विजेट में जोड़ा, मुझे एक त्रुटि मिली जो मुझे उस रिमोट इंटरफेस से बाध्य नहीं कर सका क्योंकि विजेट पहले से ही एक ब्रॉडकास्ट एलिसर है मुझे विजेट को प्रसारित करने की आवश्यकता के बिना बटन को संभालने का प्रयास करना था, लेकिन ऐसा लगता है कि यह असंभव है

अच्छी तरह से कोई समस्या नहीं है, है ना? मैंने विजेट के भीतर एक सेवा बनाई जो दूरस्थ इंटरफ़ेस से जुड़ी हुई थी, क्योंकि जब विजेट एक ब्रॉडकास्ट एलिसर है, तो सेवा नहीं है, और सब कुछ ठीक होना चाहिए।

या तो मैंने सोचा

ठीक है, मुझे विजेट सेवा ट्रिगर करने के लिए विजेट के बटन मिल रहे हैं दूरस्थ सेवा के लिए बाध्य करने से मुझे निम्न चेतावनी मिलती है:

सर्विस इन्टेंट (एक्ट = कॉम। ब्लैबाला। आईआरएमएमटीएस सेवा) शुरू करने में असमर्थ: नहीं मिला।

मैं getApplicationContext () का इस्तेमाल कर रहा हूं, ताकि दूरस्थ सामग्री पर बाध्य हो सके। मेरे पास मेनिफेस्ट में विजेट सर्विस है, लेकिन मेरे पास वहां रिमोट सेवा नहीं है। जब मैं इसे वहां रखता हूं, मुझे एक अनपेक्षित इंस्टेंटिअएशन अपेशन मिलता है।

विजेट की सेवा में स्टार्ट () में मैं यह कर रहा हूं:

getApplicationContext().bindService(new Intent(IWallpaperRemote.class.getName()), 
  mConnection, Context.BIND_AUTO_CREATE);

मेरे पास भी है...

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        mService = IWallpaperRemote.Stub.asInterface(service);
        isBound = true;
        Log.i("WidgetServiceConnection", "binding to service succeeded");
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        isBound = false;
        Log.i("WidgetServiceConnection", "binding to service lost!");
    }
};

मेरा प्रश्न यह है: क्या किसी ने कभी किसी विजेट से किसी अन्य एप्लिकेशन में दूरस्थ कॉल को सफलतापूर्वक पूरा किया है? यह सोचते हुए कि मैं यहाँ एक लाइव वॉलपेपर के बारे में बात कर रहा हूं, और यह तथ्य कि मैं विजेट प्रक्रिया के भीतर कोई गतिविधि कॉल करने में दिलचस्पी नहीं ले रहा हूं, लेकिन फ़ंक्शन को लाइव वॉलपेपर में कॉल करता है, आईपीसी के अलावा अन्य विकल्प क्या हैं, यदि कोई हो?

और अगर आईपीसी यहां जाने का रास्ता है, तो मैं क्या कर रहा हूं?





aidl