सेवा आशय प्रारंभ करने में असमर्थ


81

मेरा एक सेवा वर्ग है। मैंने इस क्लास को जार में एक्सपोर्ट किया है और मैंने अपने क्लाइंट ऐप में जार एंबेड किया है।

जब जरूरत होती है, मैं सेवा वर्ग को फोन करता हूं। जब मैं ऐसा करने की कोशिश करता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found

मेरे पास सेवा वर्ग के अलावा अन्य वर्ग है, जिसे मैं एक्सेस करने में सक्षम हूं (उस वर्ग का ऑब्जेक्ट बनाएं) जो उसी जार के अंदर हैं।

मुझे लगता है कि मैंने अपने कॉन्फ़िगरेशन या प्रकट या कुछ चीज़ को याद किया है।

कृपया मेरी पहचान करने में मदद करें। मेरा कोड नीचे है:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent = new Intent () ;  
      intent.setClassName("com.sample.service" ,"com.sample.service.serviceClass") ;  
      this.startService(intent) ; // when I call this line I get the message...  
      // binding other process continue  here   
}

ग्राहक मैनिफ़ेस्ट। Xml

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>

अग्रिम धन्यवाद,
विनय


मैंने आपके कोड को ठीक करने की कोशिश की, लेकिन स्रोत में ऐसे मुद्दे हैं जिनसे मुझे लगा कि मैं इसे समझने के लिए पर्याप्त नहीं हूं। मूल रूप से आपके पास <सेवा ...> में एक अतिरिक्त स्थान है, यह <सेवा ...> होना चाहिए, लेकिन यदि आप स्रोत को देखते हैं, तो आपके पास दो आयात विवरणों से पहले '/' है और मैं निश्चित नहीं हूं कि क्या वे हैं माना जाता है। मुझे लगता है कि '<' के बाद रिक्त स्थान आपकी समस्या का कारण होगा।
जेम्स ब्लैक

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

जवाबों:


48

सबसे पहले, आप की जरूरत नहीं है android:process=":remote", तो कृपया इसे हटा दें, क्योंकि यह सब होगा कोई फायदा नहीं के लिए अतिरिक्त रैम है।

दूसरा, चूंकि <service>तत्व में एक्शन स्ट्रिंग शामिल है, इसका उपयोग करें:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

प्रिय श्री मार्क, मैंने रिमोट जोड़ा है क्योंकि मुझे अलग-अलग ऐप से एक ही कंटेंट को एक्सेस करने की आवश्यकता है। मैं इसे वेब पर पढ़ने के बाद शामिल करता हूं कि रिमोट सेवा को लागू करना बेहतर है। मैंने आपके सुझाव के अनुसार संशोधन किया और यह अब ठीक है। एक बार फिर से धन्यवाद।
विनय

2
@Vinay: "मुझे अलग-अलग ऐप से एक ही कंटेंट को एक्सेस करने की ज़रूरत है।" आपको अभी भी ज़रूरत नहीं है android:process=":remote", इसलिए कृपया इसे हटा दें, क्योंकि यह सब कुछ बिना किसी फ़ायदे के एक्स्ट्रा रैम लेगा। एक दूरस्थ सेवा वह है जो एआईडीएल के माध्यम से एपीआई प्रदान करती है और android:processविशेषता के साथ इसका कोई लेना-देना नहीं है । यहाँ एक नमूना दूरस्थ सेवा है: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… और यहाँ उस सेवा का एक संगत ग्राहक है: github.com/commonsguy/cw .advandroid
कॉमन्सवेयर

72

किसी और के इस धागे के पार आने के लिए मेरे पास यह मुद्दा था और मेरे बालों को खींच रहा था। मेरे पास '<एप्लिकेशन>' के अंतिम टैग ड्यू की सेवा घोषणा थी!

सही:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>    

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        
</application>

<uses-permission android:name="..." />

गलत लेकिन अभी भी त्रुटियों के बिना संकलित है:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>

</application>

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        

<uses-permission android:name="..." />


7
यह एन्हांस्ड एंड्रॉइड लिंट के लिए एक नौकरी की तरह लगता है जो इन सरल गलतियों को उठाता है! जो हमें अंततः मिल सकता है।
एहतेश चौधरी

1
मैंने xml में सेवा का नाम गलत लिखा था! इससे मुझे यह संकेत मिला कि समस्या कहां थी। thanx
Arvand

अपना उत्तर पोस्ट करने के लिए धन्यवाद। इससे अंतत: सेवा शुरू नहीं होने का समाधान हुआ।
pmont

वाह! बहुत बहुत धन्यवाद। यह <एप्लिकेशन> टैग में काम क्यों नहीं करता है?
रुचिर बारोनिया

IDE गलत वर्तनी <सेवा> टैग के बारे में शिकायत नहीं करता है। हमने उस पर भी गलती की।
यंग

32

1) जाँच करें कि क्या घोषणा में सेवा घोषणा आवेदन टैग में निहित है

<application>
    <service android:name="" />
</application>

2) जांचें कि क्या आपका service.javaपैकेज एक ही पैकेज में है या गतिविधि के रूप में पैकेज को अलग करें

<application>
    <!-- service.java exists in diff package -->
    <service android:name="com.package.helper.service" /> 
</application>
<application>
    <!-- service.java exists in same package -->
    <service android:name=".service" /> 
</application>

1
बिंदी के साथ या नहीं? मेरे मामले में: नहीं, इसके बजाय मैं <सेवा एंड्रॉइड: नाम = "सेवा" /> का उपयोग करता हूं और यह काम करता है। यह stackoverflow.com/questions/2265020/…
DiveInto

डॉट के साथ, यह भी काम करना चाहिए क्योंकि शीर्ष पर आप अपने पैकेज पथ को परिभाषित करते हैं
जियानहोंग

3
यार, आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैं एक फ्रिगिन समस्या के साथ कुश्ती कर रहा हूं और यह पता चला है कि मेरी सेवा एक अलग पैकेज में थी। अगर मैं तुम्हें गले लगा सकता हूँ!
21: 21 बजे

1
2 अंक ने मदद की। बहुत बहुत धन्यवाद भाई, इसे पूरे 1 दिन के लिए क्रैक करने की कोशिश की :(। मूर्खतापूर्ण हालांकि
Archie.bpgc

5

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

लॉगकट में लॉग देखकर मैंने इस मुद्दे के बारे में चेतावनी पर गौर किया: गतिविधि को सेवा वर्ग नहीं मिल सका, लेकिन मजेदार बात यह थी कि पैकेज गलत था, इसमें एक "/" चार्ट था। कंपाइलर की तलाश थी

com.something./service.MyService

के बजाय

com.something.service.MyService

मैंने पैकेज से सेवा वर्ग को वापस ले लिया और सब कुछ ठीक काम किया।


पहले मैंने सोचा था कि / एक त्रुटि थी लेकिन अगर आप लॉगकिट प्रविष्टियों को देखते रहेंगे तो आप इसे कई बार देखेंगे और वे सभी ऐप पूरी तरह से काम कर रहे हैं।
एक्सिस

1
ठीक है, मैं आपके अनुभव से इनकार नहीं कर सकता, लेकिन मेरा थोड़ा अलग था और पैकेज से फिर से कक्षा में जाने और बाहर जाने से, ग्रहण ने अपनी गलती तय की;) और मुझे कोई रनटाइम अपवाद नहीं मिला।
शैतानीक्रो १

2
मेरा कहना है कि यह मेरे लिए भी काम कर गया। अजीब बात है, हमारी टिप्पणी खोजने में मुझे आधा घंटा लगा। धन्यवाद!
एलेक्स आरआर

मुझे लगता है कि मैं एक ही समस्या है, लेकिन मैं इसे वर्ग फ़ाइल ले जाकर तय नहीं कर सकता ...
seb

यह मेरी विशेष समस्या थी। यह पता लगाने के लिए बहुत कठिन है, लेकिन / सेवा नाम में एक सुराग था। यदि आपकी सेवा अचानक काम करना बंद कर देती है या नए चेकआउट में काम नहीं करती है, तो इसका कारण (और समाधान) हो सकता है।
हेयस हौगेन

0

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


0

मैंने वही समस्या पाई है। मैंने लगभग एक दिन खो दिया OnClickListenerविधि से एक सेवा शुरू करने की कोशिश कर रहा था - बाहर onCreateऔर 1 दिन के बाद, मैं अभी भी असफल रहा !!!! अधिक निराश! मैं नमूना उदाहरण देख रहा था RemoteServiceController। उनके काम करता है, लेकिन मेरा कार्यान्वयन काम नहीं करता है!

एकमात्र तरीका जो मेरे लिए काम कर रहा था, वह अंदर की onCreateविधि से था । किसी भी अन्य संस्करण ने काम नहीं किया और मुझे विश्वास है कि मैंने उन सभी की कोशिश की है।

निष्कर्ष:

  • यदि आप अपने सेवा वर्ग को मुख्यता से अलग पैकेज में रखते हैं, तो मुझे सभी प्रकार की त्रुटियाँ मिलेंगी
  • इसके अलावा, एक "/" सेवा के लिए रास्ता नहीं खोज सका, साथ शुरू करने की कोशिश की Intent(package,className)और कुछ भी नहीं, अन्य प्रकार के इरादे भी

  • मैंने सेवा वर्ग को गतिविधि के उसी पैकेज में स्थानांतरित किया जो अंतिम रूप से काम करता है

  • उम्मीद है कि यह इस तरह onClickसे onCreateविधि के अंदर listerners को परिभाषित करके किसी की मदद करता है :

    public void onCreate() {
    //some code......
        Button btnStartSrv  = (Button)findViewById(R.id.btnStartService);
        Button btnStopSrv  = (Button)findViewById(R.id.btnStopService);
    
        btnStartSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                startService(new Intent("RM_SRV_AIDL"));
            }
        });
    
        btnStopSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                stopService(new Intent("RM_SRV_AIDL"));
            }
        });
    
    } // end onCreate
    

मेनिफेस्ट फ़ाइल के लिए भी बहुत महत्वपूर्ण है, सुनिश्चित करें कि सेवा अनुप्रयोग का बच्चा है:

<application ... >
    <activity ... >
     ...
    </activity>
    <service
        android:name="com.mainActivity.MyRemoteGPSService"
        android:label="GPSService"
        android:process=":remote">

        <intent-filter>
             <action android:name="RM_SRV_AIDL" />
        </intent-filter>
    </service>
</application>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.