Не вдається запустити намір служби


81

У мене клас обслуговування. Я експортував цей клас у jar і вставив jar у свій клієнтський додаток.

Коли потрібно, я дзвоню в сервісний клас. Коли я намагаюся це зробити, я отримую таку помилку:

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   
}

Клієнт 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>

Заздалегідь дякую,
Віней


Я намагався виправити ваш код, але у джерелі є проблеми, які, на мою думку, я не розумію достатньо, щоб спробувати. В основному у вас є додатковий простір у <service ...>, це має бути <service ...>, але якщо ви подивитесь на джерело, перед двома операторами імпорту ви отримаєте '/', і я не впевнений, що вони повинні бути там. Я думаю, що пробіли після «<» будуть причиною вашої проблеми.
James Black

Дякую Джеймсу за відповідь. Ці місця надаються навмисно лише для відображення на сайті. Всередині коду в тегах немає пробілів. Навіть "\" призначений лише для правильного відображення на сайті .. В основному, я не отримую жодних помилок компіляції в eclipse. Тільки під час виконання, я отримую повідомлення в LogCat
Vinay

Відповіді:


48

По-перше, вам це не потрібно android:process=":remote", тому, будь ласка, видаліть його, оскільки все, що вам потрібно, це зайняти додаткову оперативну пам’ять без користі.

По-друге, оскільки <service>елемент містить рядок дії, використовуйте його:

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

Шановний пане Марк, я додав пульт дистанційного керування, оскільки мені потрібен доступ до одного вмісту з різних програм. Я включаю це після прочитання в Інтернеті, що краще впровадити віддалену службу. Я змінив відповідно до вашої пропозиції, і це зараз працює нормально. Ще раз спасибі.
Vinay

2
@Vinay: "Мені потрібен доступ до одного і того ж вмісту з різних програм." Вам все одно не потрібно android:process=":remote", тому, будь ласка, видаліть його, оскільки все, що він буде робити, - це займати додаткову оперативну пам'ять без користі. Віддалена служба - це та, яка пропонує API через AIDL і не має нічого спільного з android:processатрибутом. Ось зразок віддаленої служби: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… і ось відповідний клієнт цієї послуги: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ ...
CommonsWare

72

У когось іншого, хто стикався з цією темою, я мав цю проблему і виривав волосся. У мене була декларація служби ВНЕ кінцевого тегу '<application>' DUH!

ПРАВО:

<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

ОЦЕ ТАК! Дуже дякую. Чому це не працює в тегу <application>?
Ruchir Baronia

IDE не скаржиться на неправильно написаний тег <service>. Ми також допустили помилку.
Йонг,

32

1) перевірити, чи декларація служби в маніфесті вкладена в тег програми

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

2) перевірте, чи перебуває ви service.javaв тому самому пакеті чи пакунку diff, що і діяльність

<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
з крапкою чи ні? в моєму випадку: немає, натомість я використовую <сервіс Android: ім'я = "сервіс" /> і works.see stackoverflow.com/questions/2265020 / ...
DiveInto

з крапкою, вона теж повинна працювати, тому що вгорі ви визначаєте шлях до пакету
Jianhong

3
Чувак, дякую за вашу відповідь. Я боровся з проблемою, і виявляється, моя послуга була в іншому пакеті. Якби я міг вас обійняти, я б!
racl101

1
Допоміг 2 очко. Велике спасибі, брате, намагався зламати його протягом цілого дня :(.
Дурненько

5

Я сподіваюся, що можу допомогти комусь із цією інформацією: я переніс свій сервісний клас в інший пакет і виправив посилання. Проект був чудовим, АЛЕ клас обслуговування не вдалося знайти за цією діяльністю.

Переглядаючи журнал у журналі logcat, я помітив попередження про проблему: діяльність не могла знайти клас обслуговування, але найцікавішим було те, що пакет був неправильним, він містив символ "/". Компілятор шукав

com.something./service.MyService

замість

com.something.service.MyService

Я перемістив сервісний клас із пакету і назад, і все працювало чудово.


Спочатку я думав, що це помилка /, але якщо ви продовжуєте переглядати записи logcat, ви побачите це багато разів, і всі ці програми працюють бездоганно.
Axxiss

1
ну, я не можу заперечувати ваш досвід, але мій був дещо іншим, і, переїжджаючи та знову виходячи з класу з пакета, eclipse виправив власну помилку;), і я не отримав жодного винятку під час виконання.
sataniccrow

2
Треба сказати, що це спрацювало і у мене. Дивне питання, мені знадобився півгодини, щоб знайти наш коментар. Дякую!
Alex RR

Я думаю , що у мене є така ж проблема, але я не міг її виправити, переміщаючи файл класу ...
SEB

Це була моя особлива проблема. Дуже важко зрозуміти, але / в назві послуги було підказкою. Якщо ваша служба раптом перестає працювати або не працює в новому касі, це цілком може бути причиною (і рішенням).
Hayes Haugen

0

У моєму випадку максимальний ліміт на 1 МБ для передачі даних за Intent. Я просто скористаюся кешем або сховищем.


0

Я виявив ту саму проблему. Я втратив майже день, намагаючись запустити послугу з OnClickListenerметоду - за межами onCreateі через 1 день, я все ще не вдався !!!! Дуже розчаровує! Я дивився на зразковий приклад RemoteServiceController. Їх працює, але моя реалізація не працює!

Єдиний спосіб, який працював для мене, був із внутрішнього onCreateметоду. Жоден з інших варіантів не працював, і повірте, я спробував їх усі.

Висновок:

  • Якщо ви помістите свій клас обслуговування в інший пакет, ніж mainActivity, я отримаю всілякі помилки
  • Також той, "/" не зміг знайти шлях до служби, спробував почати з Intent(package,className)і нічого, а також інший тип запуску намірів

  • Я перемістив сервісний клас у той самий пакет, що працює у Заключній формі

  • Сподіваємось, це комусь допомагає, визначаючи лінсери onClickвсередині onCreateметоду так:

    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, переконайтеся, що служба є дочірньою частиною програми:

<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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.