Hizmet Amacı başlatılamıyor


81

Hizmet sınıfım var. Bu sınıfı jar'e aktardım ve kavanozu istemci uygulamama yerleştirdim.

Gerektiğinde servis sınıfını ararım. Bunu yapmaya çalıştığımda şu hatayı alıyorum:

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

Servis sınıfından başka, erişebildiğim (o sınıfın nesnesini yaratma) aynı kavanozun içinde olan başka bir sınıfım var.

Yapılandırmamda ya da tezahürde bir şeyi kaçırdığımı hissediyorum.

Lütfen aynısını belirlememe yardım et. Kodum aşağıdadır:

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   
}

Client manifest.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>

Şimdiden teşekkürler
Vinay


Kodunuzu düzeltmeye çalıştım ancak kaynakta denemek için yeterince anlamadığımı hissettiğim sorunlar var. Temelde <service ...> içinde fazladan bir alanınız var, bu <hizmet ...> olmalı, ancak kaynağa bakarsanız, iki import ifadesinden önce bir '/' var ve orada olması gerekiyordu. Sanırım, '<' işaretinden sonraki boşluklar sorununuz olacak.
James Black

Cevap için teşekkürler james. Bu alanlar kasıtlı olarak sadece sitede gösterilmek üzere verilmiştir. Kodun içinde etiketlerin içinde boşluk yoktur. Hatta "\" bile sadece sitede doğru gösterim içindir .. Temelde tutulma sırasında herhangi bir derleme hatası almıyorum. Yalnızca çalışma zamanında, mesajı LogCat'ta alıyorum
Vinay

Yanıtlar:


48

Öncelikle, ihtiyacınız yoktur android:process=":remote", bu yüzden lütfen çıkarın, çünkü tek yapması gereken faydası olmayan fazladan RAM almaktır.

İkinci olarak, <service>öğe bir eylem dizesi içerdiğinden, onu kullanın:

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

Sevgili Bay Mark, Uzaktan kumandayı ekledim çünkü aynı içeriğe farklı uygulamalardan erişmem gerekiyor. Bunu web'de okuduktan sonra, uzak bir hizmetin uygulanmasının daha iyi olduğunu ekliyorum. Önerinize göre değiştirdim ve şimdi iyi çalışıyor. Tekrar teşekkürler.
Vinay

2
@Vinay: "Aynı içeriğe farklı uygulamalardan erişmem gerekiyor." Hâlâ ihtiyacınız yok android:process=":remote", bu yüzden lütfen onu kaldırın, çünkü tek yapması gereken hiçbir faydası olmadan fazladan RAM kullanmaktır. Uzak hizmet, AIDL aracılığıyla bir API sunan ve android:processöznitelikle hiçbir ilgisi olmayan hizmettir . Örnek bir uzaktan hizmet: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… ve işte bu hizmetin karşılık gelen bir istemcisi: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare

72

Bu konuya rastlayan başka biri için bu sorunu yaşadım ve saçlarımı çekiyordum. '<Uygulama>' bitiş etiketinin DIŞINDA DUH!

SAĞ:

<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="..." />

YANLIŞ, ancak yine de hatasız derler:

<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
Bu, bu basit hataları toplayan gelişmiş bir android tiftiği için bir işe benziyor! Sonunda elde edebiliriz.
Ehtesh Choudhury

1
Xml'de hizmet adını yanlış yazmıştım! Bu bana sorunun nerede olduğu konusunda ipucu verdi. thanx
Arvand

Cevabınızı gönderdiğiniz için teşekkürler. Bu nihayet hizmetin başlamamasını çözdü.
pmont

VAOV! Çok teşekkürler. Neden <application> etiketinde çalışmıyor?
Ruchir Baronia

IDE, yanlış yazılmış <service> etiketinden şikayet etmez. Biz de hata yaptık.
Yeung

32

1) manifestteki hizmet bildiriminin uygulama etiketinde iç içe olup olmadığını kontrol edin

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

2) service.javaaktivitenizin aynı pakette veya diff paketinde olup olmadığını kontrol edin

<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
nokta ile mi değil mi? benim durumumda: değil, bunun yerine <service android: name = "service" /> kullanıyorum ve çalışıyor. bkz. stackoverflow.com/questions/2265020/…
08

nokta ile bu da çalışmalıdır çünkü en üstte paket yolunuzu tanımlarsınız
Jianhong

3
Dostum, cevabın için çok teşekkürler. Lanet bir sorunla boğuşuyordum ve görünüşe göre hizmetim farklı bir pakette. Sana sarılabilseydim yapardım!
racl101

1
2. nokta yardımcı oldu. Çok teşekkürler kardeşim, 1 tam gün boyunca
kırmayı

5

Umarım bu bilgiler konusunda birine yardımcı olabilirim: Hizmet sınıfımı başka bir pakete taşıdım ve referansları düzelttim. Proje mükemmeldi, ANCAK hizmet sınıfı faaliyet tarafından bulunamadı.

Logcat oturumunu izleyerek sorunla ilgili uyarıyı fark ettim: etkinlik hizmet sınıfını bulamadı, ancak komik olan şey paketin yanlış olması, "/" karakteri içermesiydi. Derleyici arıyordu

com.something./service.MyService

onun yerine

com.something.service.MyService

Servis sınıfını paketten çıkardım ve tekrar içeri aldım ve her şey yolunda gitti.


İlk önce bunun bir hata olduğunu düşündüm, ancak logcat girişlerine bakmaya devam ederseniz, birçok kez göreceksiniz ve tüm bu uygulamalar mükemmel çalışıyor.
Axxiss

1
Pekala, senin deneyimini inkar edemem ama benimki biraz farklıydı ve sınıfa paketten girip çıkarak, eclipse kendi hatasını düzeltti;) ve hiçbir çalışma zamanı istisnası almadım.
sataniccrow

2
Benim için de işe yaradığını söylemeliyim. Garip sorun, yorumumuzu bulmam yarım saatimi aldı. Teşekkürler!
Alex RR

Sanırım aynı sorunu yaşıyorum, ancak sınıf dosyasını taşıyarak sorunu çözemedim ...
seb

Bu benim özel sorunumdu. Anlaması çok zor ama hizmet adındaki / içindeki bir ipucuydu. Hizmetiniz aniden çalışmayı durdurursa veya yeni bir kasada çalışmazsa, nedeni (ve çözümü) bu olabilir.
Hayes Haugen

0

Benim durumumda, Intent tarafından veri aktarımı için maksimum 1 MB sınır. Sadece Önbellek veya Depolama kullanacağım.


0

Ben de aynı sorunu buldum. OnClickListenerYöntemden bir hizmet başlatmaya çalışırken neredeyse bir gün kaybettim - onCreate1 gün dışında ve sonra hala başarısız oldum !!!! Çok sinir bozucu! Örnek örneğe bakıyordum RemoteServiceController. Onlarınki çalışıyor, ancak benim uygulamam çalışmıyor!

Benim için işe onCreateyarayan tek yol, içeriden gelen yöntemdi. Diğer değişkenlerin hiçbiri işe yaramadı ve inanın hepsini denedim.

Sonuç:

  • Servis sınıfınızı mainActivity'den farklı bir pakete koyarsanız, her türlü hatayı alacağım
  • Ayrıca bir "/" hizmete giden yolu bulamadı, ile başlamayı denedi Intent(package,className)ve hiçbir şey, ayrıca başka bir Amaç başlatma

  • Hizmet sınıfını, çalışan son etkinlik formunun aynı paketine taşıdım

  • Umarım bu onClick, onCreateyöntemin içindeki dinleyicileri şu şekilde tanımlayarak birine yardımcı olur :

    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
    

Manifest dosyası için de çok önemli, hizmetin uygulamanın alt öğesi olduğundan emin olun:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.