web-dev-qa-db-fra.com

Impossible de démarrer le service Intention: introuvable

J'ai le même problème décrit ici mais je ne comprends pas ce qui ne va pas.

Mon problème est: Impossible de démarrer le service Intention {act = .connections.MoodyService} U = 0: introuvable

[~ # ~] modifier [~ # ~] J'ai changé mon package de connexions en service dans le code source, désolé pour la confusion

Mon manifest.xml

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.moody"
Android:installLocation="auto"
Android:versionCode="0"
Android:versionName="0.6.7 alpha" >

<uses-sdk
    Android:maxSdkVersion="18"
    Android:minSdkVersion="14"
    Android:targetSdkVersion="17" />

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    Android:allowBackup="true"
    Android:allowClearUserData="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="activities.MainActivity"
        Android:label="@string/app_name" >
    </activity>
    <activity
        Android:name="activities.Menu_esq"
        Android:label="@string/title_activity_menu_esq" >
    </activity>
    <activity
        Android:name="activities.BaseActivity"
        Android:label="@string/title_activity_base" >
    </activity>
    <activity
        Android:name="activities.MainView"
        Android:label="@string/title_activity_main_view" >
    </activity>
    <activity
        Android:name="activities.LoginActivity"
        Android:label="@string/app_name"
        Android:noHistory="true"
        Android:windowSoftInputMode="adjustResize|stateVisible" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name="com.example.moody.LeftActivity"
        Android:label="@string/title_activity_left" >
    </activity>
    <activity
        Android:name="com.example.moody.RightActivity"
        Android:label="@string/title_activity_right" >
    </activity>
    <activity
        Android:name="activities.UserDetailsActivity"
        Android:label="@string/title_activity_user_details" >
    </activity>
    <activity
        Android:name="fragments.TopicsPreview"
        Android:label="@string/title_activity_copy_of_topics_preview" >
    </activity>
    <activity Android:name="activities.Loading" >
    </activity>

    <service
        Android:name=".service.MoodyService"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/moody_service" >
    </service>
</application>

le service est le package et MoodyService est le nom de la classe

Ma classe de service

public class MoodyService extends Service {

public MoodyService() {
    // TODO Auto-generated constructor stub
}

private boolean isRunning = false;
Object getContent;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub

    return null;
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    // Announcement about starting
    Toast.makeText(this, "Starting the Demo Service", Toast.LENGTH_SHORT)
            .show();

    // Start a Background thread
    isRunning = true;
    Thread backgroundThread = new Thread(new BackgroundThread());
    backgroundThread.start();

    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();

    // Stop the Background thread
    isRunning = false;

    // Announcement about stopping
    Toast.makeText(this, "Stopping the Demo Service", Toast.LENGTH_SHORT)
            .show();
}

private class BackgroundThread implements Runnable {
    int counter = 0;

    public void run() {
        try {
            counter = 0;
            while (isRunning) {
                System.out.println("" + counter++);
                new Contents().getAll(getResources(),
                        getApplicationContext());
                Thread.currentThread().sleep(5000);
            }

            System.out.println("Background Thread is finished.........");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Et dans mon intention principale.

Intent start = new Intent(".service.MoodyService");
        this.startService(start);

et a également essayé

Intent intent = new Intent(this, MoodyService.class);
        this.startService(intent);

et essayé avec le chemin complet

<service
    Android:name="com.example.moody.service.MoodyService"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/moody_service" >
29
firetrap

Résolu

J'ai supprimé la période au début du nom du package dans le manifeste et cela a fonctionné, en d'autres termes:

Cela ne fonctionne pas:

.yourPackage.YourClass

Mais cela fonctionne:

 yourPackage.YourClass

Et pour l'essentiel:

Intent intent = new Intent(this, MoodyService.class);
        this.startService(intent);

Mais cela va à l'encontre de ce qui est écrit en la documentation :

Android: nom Le nom de la sous-classe de service qui implémente le service. Il doit s'agir d'un nom de classe complet (tel que "com.example.project.RoomService"). Cependant, en raccourci, si le premier caractère du nom est un point (par exemple, ".RoomService"), il est ajouté au nom du package spécifié dans l'élément. Une fois que vous avez publié votre application, vous ne devez pas modifier ce nom (sauf si vous avez défini Android: exports = "false").

Il n'y a pas de défaut. Le nom doit être spécifié.

26
firetrap

Le service doit également être inclus dans le Manifest:

<service Android:name="com.x.x.serviceclass"></service>

Je ne sais pas pourquoi vous utilisez ce nom de type package pour votre nom de service, mais pourquoi n'utilisez-vous pas le nom de classe pour démarrer le service?

Intent intent = new Intent(context, YourService.class);
context.startService(intent);
4
SLee

Je pense que le nom du package manifeste pour le service est incorrect car vous avez dit que le nom de votre package est connections, il devrait donc être comme ceci

  Android:name ="connections.MoodyService"

ou

  Android:name="com.example.moody.connections.MoodyService"

invoquer le service faire

  Intent intent = new Intent(this, MoodyService.class);
    this.startService(intent);
2
Shakeeb Ayaz

Assurez-vous d'avoir déclaré votre service dans le fichier manifeste.

<service  
      Android:name=".MyService"  
      Android:enabled="true" >
</service>

et essayez d'écrire getApplicationContext () au lieu du mot-clé "this"

startService(new Intent(getApplicationContext(), MoodyService.class));
1
Anu

mon service est dans le package "service" et mon service manifeste est comme ceci;

     <service
        Android:name="service.TimerService"
        Android:exported="false" >
    </service>
1
Habil

Avez-vous créé un constructeur vide dans le service?

Sinon, essayez ça.

Je ne sais pas non plus si vous pouvez utiliser l'intention comme ça. Vous pouvez essayer la construction "new Inten (this, MoodyService.class)".

0
cYrixmorten