suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Serviceproblem in Android Studio

Neuling, ich bin zu Beginn des Lerndienstes auf ein Problem gestoßen
Ich habe es gemäß dem Tutorial gemacht und es ist beim Starten des Dienstes abgestürzt
MyService.java

Paket com.example.administrator.myhhhhh;

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

öffentliche Klasse MyService erweitert 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

Paket com.example.administrator.myhhhhh;

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

öffentliche Klasse MainActivity erweitert AppCompatActivity implementiert 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" binding="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>

Logcat-Fehlermeldung:
05-04 21:28:44.377 21214-21214/com.example.administrator.myhhhhh E/AndroidRuntime: FATAL EXCEPTION: 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/Prozess: Sendesignal PID: 21214 SIG: 9

phpcn_u1582phpcn_u15822743 Tage vor969

Antworte allen(3)Ich werde antworten

  • 大家讲道理

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

    Intent intent=new Intent("MyService");什么鬼?这个不管什么版本的android系统都无法调起来的,service启动的方式分文两种,显示调用和隐式调用:

    1)显示启动:

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

    通过class调起service,

    2)隐式启动:

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

    里面是service类的绝对路径(带有包名部分),需要注意的是隐式启动在android最新版本(5.0以上)已经被弃用(由于安全问题),你需要对他进行一些额外的处理(通过action获取它的ComponentName属性),以下提供你一个方式,代码如下:

     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);
        }

    祝你好运~

    Antwort
    0
  • PHP中文网

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

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

    Antwort
    0
  • 大家讲道理

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

    自己的intent写错了

    Antwort
    0
  • StornierenAntwort