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

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

问题描述

我想了解有界的服务。下面我的示例程序中,我尝试按照<一个href="http://developer.android.com/guide/components/bound-services.html">http://developer.android.com/guide/components/bound-services.html 。该服务的功能,据我可以播放,暂停和停止音频然而,当我切换到另一个应用程序,我得到以下服务未注册的错误。

 了java.lang.RuntimeException:无法停止活动{com.example.dd_services_audio_01 / com.example.dd_services_audio_01.MainActivity}:java.lang.IllegalArgumentException:如果服务未注册:COM。 example.dd_services_audio_01.MainActivity$1@2afca5d8
09-05 14:04:32.625:E / AndroidRuntime(5810):在android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2451)
09-05 14:04:32.625:E / AndroidRuntime(5810):在android.app.ActivityThread.handleStopActivity(ActivityThread.java:2496)
 

由于编码似乎遵循的文档例如紧密我不知道哪里出了问题。我运行这个程序有minSdk水平8. MainActivity.onStop的错误发生在该行

  mService.unbindService(mConnection);
 

任何建议,以解决这个问题将是巨大的。

感谢

马丁

 包com.example.dd_services_audio_01;

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

进口com.example.dd_services_audio_01.AudioPlayerService.AudioPlayerBinder;

公共类MainActivity延伸活动{

私人最终字符串变量=MainActivity;

AudioPlayerService MSERVICE;
布尔mBound = FALSE;

按钮mPlay,mPause,MSTOP;

字符串的AudioFile = Environment.getExternalStorageDirectory()
        +/justdzongsar/DJKR_AboutToGetIt.mp3;

@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);

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

    mPlay =(按钮)findViewById(R.id.buttonPlay);
    mPause =(按钮)findViewById(R.id.buttonPause);
    MSTOP =(按钮)findViewById(R.id.buttonStop);

    mPlay.setOnClickListener(新OnClickListener(){
        公共无效的onClick(视图v){
            mService.play(AUDIOFILE);
        }
    });

    mPause.setOnClickListener(新OnClickListener(){
        公共无效的onClick(视图v){
            mService.pause();
        }
    });

    mStop.setOnClickListener(新OnClickListener(){
        公共无效的onClick(视图v){
            mService.stop();
        }
    });

}

@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    。getMenuInflater()膨胀(R.menu.activity_main,菜单);
    返回true;
}

@覆盖
保护无效的OnStart(){
    super.onStart();
    //绑定到本地服务
    意向意图=新的意图(这一点,AudioPlayerService.class);
    bindService(意向,mConnection,Context.BIND_AUTO_CREATE);


}

@覆盖
保护无效的onStop(){
    super.onStop();

    如果(mBound){
        mService.unbindService(mConnection);
        mBound = FALSE;
    }
}

/ **定义回调服务绑定,传递给bindService()* /
私人ServiceConnection mConnection =新ServiceConnection(){

    @覆盖
    公共无效onServiceConnected(组件名的className,服务的IBinder){
        //我们势必本地服务,铸就的IBinder并获得
        //本地服务实例
        AudioPlayerBinder粘合剂=(AudioPlayerBinder)服务;
        MSERVICE = binder.getService();
        mBound = TRUE;
    }

    @覆盖
    公共无效onServiceDisconnected(组件名称为arg0){
        MSERVICE = NULL;
        mBound = FALSE;
    }
};

}
 

 包com.example.dd_services_audio_01;

进口java.io.IOException异常;

进口android.app.Service;
进口android.content.Intent;
进口android.media.MediaPlayer;
进口android.media.MediaPlayer.OnCompletionListener;
进口android.media.MediaPlayer.On preparedListener;
进口android.os.Binder;
进口android.os.IBinder;
进口android.util.Log;

公共类AudioPlayerService扩展服务实现在preparedListener,
    OnCompletionListener {

私人最终字符串变量=AudioPlayerService;

私人最终的IBinder mBinder =新AudioPlayerBinder();

私人MediaPlayer的mMediaPlayer;

私人字符串currentDataSource;

公共类AudioPlayerBinder扩展粘合剂{
    公共AudioPlayerService的getService(){
        Log.v(TAG,AudioPlayerBinder:的getService()被称为);
        返回AudioPlayerService.this;
    }
}

@覆盖
公众的IBinder onBind(意向意图){
    // TODO自动生成方法存根
    返回mBinder;
}

@覆盖
公共布尔onUnbind(意向意图){
    //所有的客户端都绑定与unbindService()
    返回false;
}

@覆盖
公共无效ONSTART(意向意图,诠释startId){
    Log.i(TAG,
            AudioPlayerService:ONSTART()调用,例如=
                    + this.hash code());
}

@覆盖
公共无效的onDestroy(){
    Log.i(TAG,AudioPlayerService:的onDestroy()被称为);
    releaseMediaPlayer();
}

// -----

公共无效戏(字符串AUDIOFILE){
    Log.d(TAG,+ AUDIOFILE调用文件的音频播放);
    如果(mMediaPlayer = NULL和放大器;!&安培; audioFile.compareTo(currentDataSource)== 0){
        如果(mMediaPlayer.isPlaying()==真){
            返回;
        }
        mMediaPlayer.start();

        返回;
    }
    releaseMediaPlayer();

    尝试 {

        mMediaPlayer =新的MediaPlayer();
        mMediaPlayer.setDataSource(AUDIOFILE);


        mMediaPlayer.setOn preparedListener(本);
        mMediaPlayer.setOnCompletionListener(本);
        currentDataSource = AUDIOFILE;

                    。mMediaPlayer prepareAsync();


    }赶上(IOException异常IOE){
        Log.e(TAG,错误尝试玩+的AudioFile,IOE);
    }

}

公共无效暂停(){

    Log.d(TAG,声音暂停);
    如果(mMediaPlayer =空&安培;!&安培; mMediaPlayer.isPlaying()){
        mMediaPlayer.pause();
    }
}

公共无效寻求(INT timeInMillis){
    如果(mMediaPlayer!= NULL){
        mMediaPlayer.seekTo(timeInMillis);
    }
}

公众诠释经过(){
    如果(mMediaPlayer == NULL){
        返回0;
    }
    返回mMediaPlayer.getCurrentPosition();
}

公共无效停止(){
    Log.d(TAG,音频站);
    releaseMediaPlayer();
}

//  - 

私人无效releaseMediaPlayer(){
    如果(mMediaPlayer == NULL){
        返回;
    }

    如果(mMediaPlayer.isPlaying()){
        mMediaPlayer.stop();
    }
    mMediaPlayer.release();
    mMediaPlayer = NULL;
}

@覆盖
公共无效onCompletion(MediaPlayer的为arg0){
    // TODO自动生成方法存根
    releaseMediaPlayer();
}

@覆盖
公共无效于prepared(MediaPlayer的MP){
    如果(熔点!= NULL){
        mp.start();
    }

    // TODO自动生成方法存根

}

}
 

解决方案

也有类似的问题,但接受的答案是不适合我的解决方案。幸运的是,评论人给我答案:

  

onServiceDisconnected 不应该当你解除你的服务,所以不要依赖它来提高。它应该通知你的情况下你的服务和ServiceConnection之间的连接断开。

由于@Waqas我发现了错误:我是更新布尔绑定标记只在 onServiceConnected() onServiceDisconnected()。现在,我已经添加了绑定=假每次我打电话 unbindService()有这样的问题了。就是这样,不依赖 onServiceDisconnected

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)

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.

Thanks

martin

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

}

and

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 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.

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天全站免登陆