Активность не может быть привязана к сервису, точно такой же код работает в другой активности - PullRequest
3 голосов
/ 29 ноября 2011

Хорошо, я сделал Service, чтобы мой музыкальный проигрыватель мог работать во всех моих действиях. По крайней мере, это был план.

Я могу связываться со своим служением в некоторых из моих действий, но в других делах связывание, похоже, ничего не делает.

Настройка Мой сервис запускается на главном экране:

startService(new Intent(this, MusicService.class));

Я пытаюсь связать это с несколькими другими действиями. Список действий выглядит так:

MainScreen -> FillerActivity -> привязка к сервису -> Работает

MainScreen -> AlbumList -> SongList -> SingleSong -> привязка к сервису -> не работает

В чем может быть причина того, что привязка работает в классе FillerActivity, но не работает в классе SingleSong?

Мой код выглядит следующим образом:

Наполнитель

public class Filler extends Activity {
    private MusicService s;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.filler);
        doBindService();

        Button b = (Button) findViewById(R.id.terug);
        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });

    }

    public void startSong(View view){
        if(s != null){
        s.startSong(s.songPlaying);
        System.out.println("Song started");
        }
    }

    public void stopSong(View view){
        if(s != null){
        s.stopSong();
        System.out.println("Song paused");
        }
    }


    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder binder) {
            s = ((MusicService.MyBinder) binder).getService();
            Toast.makeText(Filler.this, "Connected",
                    Toast.LENGTH_SHORT).show();
            System.out.println("s is gevuld");
        }

        public void onServiceDisconnected(ComponentName className) {
            s = null;
        }
    };


    void doBindService() {
        bindService(new Intent(this, MusicService.class), mConnection,
                Context.BIND_AUTO_CREATE);
    }
}

SingleSong

public class SingleSongInfo extends Activity {

    private MediaDetail mDetails;
    private TextView textView;
    boolean playing = false;
    private String songURL;
    private MusicService s;
    Button b;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.album_song_info);
        Bundle bun = getIntent().getExtras();

        doBindService();

        if (s != null) {
            System.out.println("S filled");

        } else {
            System.out.println("S empty");
        }

        b = (Button) findViewById(R.id.playButtonSongPage);

        mDetails = (MediaDetail) bun.getSerializable("details");
        if (mDetails != null) {
            System.out.println("Details gevuld");
            songURL = mDetails.getSong_url();

            setUpTextViews();
            setUpImage();

            b.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {

                }
            });

        }

    }

    public void buttonPressed(View view) {

        if (s != null) {
            if (!s.isPlaying()) {
                s.startSong(songURL);
                b.setBackgroundResource(R.drawable.button_pause);
            } else {
                s.stopSong();
                b.setBackgroundResource(R.drawable.button_play);
            }
        } else {
            System.out.println("S is leeg");
        }
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder binder) {
            s = ((MusicService.MyBinder) binder).getService();
            Toast.makeText(SingleSongInfo.this, "Connected", Toast.LENGTH_SHORT)
                    .show();
        }

        public void onServiceDisconnected(ComponentName className) {
            s = null;
        }
    };

    void doBindService() {
        bindService(new Intent(this, MusicService.class), mConnection,
                Context.BIND_AUTO_CREATE);
    }

}

Любая помощь очень ценится.


Интересное открытие после еще нескольких испытаний. Когда я вызываю класс SingleSong непосредственно из MainScreen, объект MediaService s заполняется и может использоваться. Он даже печатает сообщение, что он был заполнен.

Однако, когда класс SingleSong открывается через SongList (который открывает класс SingleSong в представлении табуляции с некоторыми другими классами), объект, который не заполняется. НО, и вот где это странно, он не печатает сообщение о том, что объект НЕ был заполнен, хотя и должен. Код для этого можно найти ниже.

Что может быть причиной того, что код полностью не запускается в tabView?

Используемый код:

private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder binder) {
            s = ((MusicService.MyBinder) binder).getService();
            Toast.makeText(SingleSongInfo.this, "Connected", Toast.LENGTH_SHORT)
                    .show();

            if (s != null) {
                System.out.println("S filled"); // works when calling class directly

            } else {
                System.out.println("S empty"); // Does not print when object is empty when class is called through SongList (tabview)
            }
        }

        public void onServiceDisconnected(ComponentName className) {
            s = null;
        }
    };

1 Ответ

4 голосов
/ 30 ноября 2011

удалось решить проблему в конце концов. Это произошло потому, что я использовал класс SingleSong внутри tabView. В связи с этим мне пришлось внести небольшую, но важную поправку.

private void doBindService() {

        getApplicationContext().bindService( // getApplicationContext() fixed the problem here.
                new Intent(getApplicationContext(), MusicService.class),
                mConnection, Context.BIND_AUTO_CREATE);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...