1

理解できない問題が発生しました。私はそれを8日間解決しようとしていますが、まだ立ち往生しています。より経験豊富な開発者に尋ねましたが、彼らは答えられません。だからどうか、私は必死に助けを求めます

このサービスは単純です - メソッドはまだ 1 つしかありません - ログが返されるはずです - getLog()

public class AudioService extends Service{

     MyBinder binder = new MyBinder();

public void getLog(){Log.d("MyLog","I reached getLog!");}

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return binder;
    }
     class MyBinder extends Binder {
            AudioService getService() {
              return AudioService.this;
            }
          }
        }

audioService.getLog(); にアクセスしようとすると MainActivity がクラッシュします。ただし、 AudioService audioService= new AudioService(); という行を挿入してもクラッシュしません。しかし、それは私が望んでいないことです-あるアクティビティからmp3を開始し、別のアクティビティから停止できるように、オーディオを再生するサービスを設定する必要があります。ここに MainActivity があります:

public class MainActivity extends Activity {
    ServiceConnection sConn;
    Intent intservice;
    AudioService audioService ;

    boolean bound=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        intservice=new Intent(this,AudioService.class);
        sConn=new ServiceConnection(){

            @Override
            public void onServiceConnected(ComponentName arg0, IBinder binder) {
                // TODO Auto-generated method stub
                audioService = ((AudioService.MyBinder) binder).getService(); 
                bound=true;
            }

            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                // TODO Auto-generated method stub
                bound=false;

            }

        };
            startService(intservice);

            audioService.getLog();

    }
    @Override
    protected void onStart() {
      super.onStart();
      bindService(intservice, sConn, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
      super.onStop();
      if (!bound) return;
      unbindService(sConn);
      bound = false;
    }
}

マニフェストで何かを台無しにした場合に備えて、ここにサービスの一部を含めます。

  </activity>
        <service android:enabled="true" android:name="AudioService"></service>
    </application>

</manifest>

ここで何が悪いのか理解できないので、どこが間違っていたのかアドバイスをお願いします

4

1 に答える 1

0

なるほど、その理由がわかりました。バインディングは時間を必要とする手順であり、既存のすべての例は onClick を待機します。これは、Activity が onStart() と onCreate() の間に十分な時間があることを意味します。私の場合、それはすぐに行きます。したがって、最善の方法は、すべてのアクティビティを public void onServiceConnected(ComponentName arg0, IBinder バインダー) の下に移動することです。つまり、バインディングが発生した後、アクティビティは順調に進みます。

多くの人に役立つことを願っています)

于 2013-08-09T10:40:46.200 に答える