recherche

Maison  >  Questions et réponses  >  le corps du texte

Problème de service dans Android Studio

Débutant, j'ai rencontré un problème au début de l'apprentissage de Service
Je l'ai fait selon le tutoriel, et il a planté au démarrage du service
MyService.java

package com.example.administrator.myhhhhh;

importer android.app.Service;
importer android.content.Intent;
importer android.os.IBinder;
importer android.util.Log;

classe publique MyService étend le service {

public MyService() {
}

@Override
public void onCreate() {
    Log.i("LOG","onCreat");
    super.onCreate();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}

}

MainActivity.java

package com.example.administrator.myhhhhh;

importer android.content.Intent;
importer android.support.v7.app.AppCompatActivity;
importer android.os.Bundle;
importer android.view.View;
importer android.widget.Button;

La classe publique MainActivity étend AppCompatActivity implémente View.OnClickListener{

private Button start,stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button start=(Button)findViewById(R.id.button);
    Button stop=(Button)findViewById(R.id.button2);
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Intent intent=new Intent("MyService");
    switch (v.getId()){
        case R.id.button:
            startService(intent);
            break;
        case R.id.button2:
            stopService(intent);
            break;
    }
}

}

Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.administrator.myhhhhh">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".MyService"
        >
        <intent-filter>
            <action android:name="MyService"/>
        </intent-filter>
    </service>
</application>

</manifeste>

Message d'erreur Logcat :
05-04 21:28:44.377 21214-21214/com.example.administrator.myhhhhh E/AndroidRuntime : EXCEPTION FATALE : main

                                                                               Process: com.example.administrator.myhhhhh, PID: 21214
                                                                               java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=MyService }
                                                                                   at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1851)
                                                                                   at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1880)
                                                                                   at android.app.ContextImpl.startService(ContextImpl.java:1864)
                                                                                   at android.content.ContextWrapper.startService(ContextWrapper.java:516)
                                                                                   at com.example.administrator.myhhhhh.MainActivity.onClick(MainActivity.java:26)
                                                                                   at android.view.View.performClick(View.java:4918)
                                                                                   at android.view.View$PerformClick.run(View.java:20399)
                                                                                   at android.os.Handler.handleCallback(Handler.java:815)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                                   at android.os.Looper.loop(Looper.java:194)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5871)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1119)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)

05-04 21:28:44.434 21214-21214/com.example.administrator.myhhhhh I/Process : Envoi du signal PID : 21214 SIG : 9

phpcn_u1582phpcn_u15822794 Il y a quelques jours1017

répondre à tous(3)je répondrai

  • 大家讲道理

    大家讲道理2017-05-16 13:30:31

    Intent intent=new Intent("MyService");Qu'est-ce que c'est ? Celui-ci ne peut pas être appelé quelle que soit la version du système Android. Il existe deux manières de démarrer le service, l'appel explicite et l'appel implicite :

    1) Démarrage de l'affichage :

    Intent intent=new Intent(MainActivity.this,MyService.class);

    Service d'appel en classe,

    2) Démarrage implicite :

    Intent intent=new Intent("com.example.administrator.myhhhhh.MyService");

    Il s'agit du chemin absolu de la classe de service (avec la partie nom du package). Il convient de noter que le démarrage implicite est obsolète dans la dernière version d'Android (5.0 et supérieure) (en raison de problèmes de sécurité), et vous devez le faire. effectuez un traitement supplémentaire dessus (obtenez sa propriété ComponentName via l'action), voici un moyen pour vous, le code est le suivant :

     protected static synchronized void startService(Context context,String action){
            LogUtils.debug("startHeartBeatService.");
            if (context==null){
                throw new NullPointerException("context must not be null.");
            }
            //add Urgent listener service.
            Intent mIntent=new Intent();
            mIntent.setAction(action);
            PackageManager pm = context.getPackageManager();
            List<ResolveInfo> resolveInfo = pm.queryIntentServices(mIntent, 0);
            // Make sure only one match was found
            if (resolveInfo == null || resolveInfo.size() != 1) {
                LogUtils.debug("not found action like this \'com.hll.push.heartbeat\'");
                return;
            }
            // Get component info and create ComponentName
            ResolveInfo serviceInfo = resolveInfo.get(0);
            String packageName = serviceInfo.serviceInfo.packageName;
            String className = serviceInfo.serviceInfo.name;
            ComponentName component = new ComponentName(packageName, className);
            // Create a new intent. Use the old one for extras and such reuse
            Intent explicitIntent = new Intent(mIntent);
            // Set the component to be explicit
            explicitIntent.setComponent(component);
            context.startService(explicitIntent);
        }

    Je vous souhaite bonne chance~

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-16 13:30:31

    Intent intent=new Intent(this,MyService.class);

    répondre
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:30:31

    Mon intention a été mal écrite

    répondre
    0
  • Annulerrépondre