android 服务 - 错误:服务未注册 [英] android services - error: service not registered

查看:18
本文介绍了android 服务 - 错误:服务未注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试了解有界服务.在我尝试遵循的示例程序下方 http://developer.android.com/guide/components/bound-services.html .该服务可以播放、暂停和停止音频,但当我切换到另一个应用程序时,我收到以下服务未注册错误.

I am trying to understand bounded services. Below my sample program in which I try to follow http://developer.android.com/guide/components/bound-services.html . The service functions as far as I can play, pause, and stop the audio yet when I switch to another app I get the following Service not registered error.

java.lang.RuntimeException: Unable to stop activity {com.example.dd_services_audio_01/com.example.dd_services_audio_01.MainActivity}: java.lang.IllegalArgumentException: Service not registered: com.example.dd_services_audio_01.MainActivity$1@2afca5d8
09-05 14:04:32.625: E/AndroidRuntime(5810):     at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2451)
09-05 14:04:32.625: E/AndroidRuntime(5810):     at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2496)

由于编码似乎紧跟文档示例,我不知道哪里出了问题.我用 minSdk 级别 8 运行这个应用程序.错误发生在 MainActivity.onStop 行

As the coding seems to follow the documentation example closely I have no clue where things go wrong. I run this app with minSdk level 8. The error happens in MainActivity.onStop at the line

 mService.unbindService(mConnection);

任何解决此问题的建议都会很棒.

Any suggestions to solve this would be great.

谢谢

马丁

package com.example.dd_services_audio_01;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.dd_services_audio_01.AudioPlayerService.AudioPlayerBinder;

public class MainActivity extends Activity {

private final String TAG = "MainActivity";

AudioPlayerService mService;
boolean mBound = false;

Button mPlay, mPause, mStop;

String audioFile = Environment.getExternalStorageDirectory()
        + "/justdzongsar/DJKR_AboutToGetIt.mp3";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Log.d(TAG,"onCreate");
    setContentView(R.layout.activity_main);

    mPlay = (Button) findViewById(R.id.buttonPlay);
    mPause = (Button) findViewById(R.id.buttonPause);
    mStop = (Button) findViewById(R.id.buttonStop);

    mPlay.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            mService.play(audioFile);
        }
    });

    mPause.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            mService.pause();
        }
    });

    mStop.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            mService.stop();
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
protected void onStart() {
    super.onStart();
    // Bind to LocalService
    Intent intent = new Intent(this, AudioPlayerService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);


}

@Override
protected void onStop() {
    super.onStop();

    if (mBound) {
        mService.unbindService(mConnection);
        mBound=false;
    }
} 

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {
        // We've bound to LocalService, cast the IBinder and get
        // LocalService instance
        AudioPlayerBinder binder = (AudioPlayerBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mService = null;
        mBound = false;
    }
};

}

package com.example.dd_services_audio_01;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class AudioPlayerService extends Service implements OnPreparedListener,
    OnCompletionListener {

private final String TAG = "AudioPlayerService";

private final IBinder mBinder = new AudioPlayerBinder();

private MediaPlayer mMediaPlayer;

private String currentDataSource;

public class AudioPlayerBinder extends Binder {
    public AudioPlayerService getService() {
        Log.v(TAG, "AudioPlayerBinder: getService() called");
        return AudioPlayerService.this;
    }
}

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

@Override
public boolean onUnbind(Intent intent) {
    // All clients have unbound with unbindService()
    return false;
}

@Override
public void onStart(Intent intent, int startId) {
    Log.i(TAG,
            "AudioPlayerService: onStart() called, instance="
                    + this.hashCode());
}

@Override
public void onDestroy() {
    Log.i(TAG, "AudioPlayerService: onDestroy() called");
    releaseMediaPlayer();
}

// -----

public void play(String audioFile) {
    Log.d(TAG, "audio play called with file " + audioFile);
    if (mMediaPlayer != null && audioFile.compareTo(currentDataSource) == 0) {
        if (mMediaPlayer.isPlaying() == true) {
            return;
        }
        mMediaPlayer.start();

        return;
    }
    releaseMediaPlayer();

    try {

        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setDataSource(audioFile);


        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        currentDataSource = audioFile;

                    mMediaPlayer.prepareAsync();


    } catch (IOException ioe) {
        Log.e(TAG, "error trying to play " + audioFile, ioe);
    }

}

public void pause() {

    Log.d(TAG, "audio pause");
    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
        mMediaPlayer.pause();
    }
}

public void seek(int timeInMillis) {
    if (mMediaPlayer != null) {
        mMediaPlayer.seekTo(timeInMillis);
    }
}

public int elapsed() {
    if (mMediaPlayer == null) {
        return 0;
    }
    return mMediaPlayer.getCurrentPosition();
}

public void stop() {
    Log.d(TAG, "audio stop");
    releaseMediaPlayer();
}

// --

private void releaseMediaPlayer() {
    if (mMediaPlayer == null) {
        return;
    }

    if (mMediaPlayer.isPlaying()) {
        mMediaPlayer.stop();
    }
    mMediaPlayer.release();
    mMediaPlayer = null;
}

@Override
public void onCompletion(MediaPlayer arg0) {
    // TODO Auto-generated method stub
    releaseMediaPlayer();
}

@Override
public void onPrepared(MediaPlayer mp) {
    if (mp != null) {
        mp.start();
    }

    // TODO Auto-generated method stub

}

}

推荐答案

有一个类似的问题,但接受的答案不是我的解决方案.幸运的是,其中一条评论给了我答案:

Had a similar problem, but the accepted answer was not the solution for me. Luckily one of the comments gave me the answer:

onServiceDisconnected 不应该在您解除服务绑定时引发,所以不要依赖它.如果您的 Service 和 ServiceConnection 之间的连接断开,它应该会通知您.

onServiceDisconnected is not supposed to be raised when you unbind your service, so don't rely on it. It is supposed to inform you in case the connection between your Service and ServiceConnection is dropped.

感谢@Waqas,我发现了错误:我只在onServiceConnected()onServiceDisconnected() 中更新了boolean 绑定 标志.现在我每次调用 unbindService() 时都添加了binded=false",问题就解决了.就是这样,不要依赖 onServiceDisconnected

Thanks to @Waqas I found the error: I was updating the boolean binded flag only inside onServiceConnected() and onServiceDisconnected(). Now I've added "binded=false" every time I call unbindService() and the problem has gone. That's it, don't rely on onServiceDisconnected

这篇关于android 服务 - 错误:服务未注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆