Rumah > Soal Jawab > teks badan
Pemula, saya menghadapi masalah pada permulaan pembelajaran Perkhidmatan
Saya melakukannya mengikut tutorial, dan ia ranap semasa memulakan perkhidmatan
MyService.java
pakej com.contoh.pentadbir.myhhhhh;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
MyService kelas awam melanjutkan Perkhidmatan {
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
pakej com.contoh.pentadbir.myhhhhh;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
MainActivity kelas awam melanjutkan AppCompatActivity melaksanakan 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>
</manifest>
Mesej ralat Logcat:
05-04 21:28:44.377 21214-21214/com.example.administrator.myhhhhh E/AndroidRuntime: PENGECUALIAN MAUT: utama
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/Proses: Menghantar isyarat PID: 21214 SIG: 9
大家讲道理2017-05-16 13:30:31
Intent intent=new Intent("MyService");What the hell? Ini tidak boleh dipanggil tanpa mengira versi sistem Android Terdapat dua cara untuk memulakan perkhidmatan, panggilan eksplisit dan panggilan tersirat:
1) Paparan permulaan:
Intent intent=new Intent(MainActivity.this,MyService.class);
Perkhidmatan panggilan melalui kelas,
2) Permulaan tersirat:
Intent intent=new Intent("com.example.administrator.myhhhhh.MyService");
Ia adalah laluan mutlak kelas perkhidmatan (dengan bahagian nama pakej) Perlu diingat bahawa permulaan tersirat telah ditamatkan dalam versi terkini Android (5.0 dan ke atas) (disebabkan oleh isu keselamatan), dan anda perlu lakukan beberapa pemprosesan tambahan padanya (Dapatkan sifat ComponentName melalui tindakan), berikut ialah cara untuk anda, kodnya adalah seperti berikut:
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);
}
Semoga berjaya~