Maison > Questions et réponses > le corps du texte
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
大家讲道理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~