无法更新Fragment from Service

时间:2016-09-12 08:54:38

标签: java android broadcastreceiver

我正在运行运行音频的服务。我在片段的布局中创建了一个TextView,它应该显示正在播放的曲目的标题。

目前,当用户从片段中选择曲目或点击跳到下一个或上一个按钮时,我已设置要更新的TextView

   @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

//other stuff

        String[] topText = getResources().getStringArray(R.array.topText_array);
        songNowPlayingLabel.setText("Now Playing : " + topText[position]);
   }


    button_skipNext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    musicService.playNext();

                    songNowPlayingLabel.setText("Now Playing : " + topText[musicService.songPosn]);

                }
            });

但是,当前曲目完成且“服务”自动播放下一首曲目时,TextView不会更新。此外,该应用程序还使用自定义通知,该通知在应用程序不再在屏幕上但在服务中播放音乐时显示。在这种情况下,当按下下一个/上一个的通知按钮时,TextView不会更新。

我希望每当轨道从通知按钮更改或轨道完成时更新TextView。为此我创建了一个广播监听器并将其添加到onStartCommand的{​​{1}}。但是这对MusicService.java没有影响。

我在同一个问题上经历过其他一些主题,但无法解决此问题。我做错了什么?

TextView的xml

TextView

MusicService.java的相关部分

           <TextView
                android:id="@+id/songNowPlayingLabel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:textColor="#eeeeee"
                android:textStyle="bold"
                android:singleLine="true"
                android:ellipsize="marquee"
                android:marqueeRepeatLimit="marquee_forever"
                android:focusableInTouchMode="true"/>

Fragment.java

        static final public String BROADCAST_ACTION = "com.myapplication.broadcastSongNowPlayingLabel";

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {

            //... other stuff

            intent = new Intent(BROADCAST_ACTION);
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

问题与发送或接收广播无关,问题是即使在片段中收到广播后, @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // other stuff bManger = LocalBroadcastManager.getInstance(getActivity()); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(MusicService.BROADCAST_ACTION); bManger.registerReceiver(broadcastReceiver, intentFilter); } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MusicService.BROADCAST_ACTION)) { String[] topText = getResources().getStringArray(R.array.topText_array); songNowPlayingLabel.setText("Now Playing : " + topText[musicService.songPosn]); } } }; LocalBroadcastManager bManger; 也不会更新。

2 个答案:

答案 0 :(得分:0)

您正在片段中使用LocalBroadcastManager。

在MusicService.java中使用以下内容:

LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);

代替

sendBroadcast(intent);

答案 1 :(得分:0)

经过大量挖掘,我想出了什么

在MusicService.java中

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

        songPosn = 0  // defined as a public integer
        //other stuff
        topText = getResources().getStringArray(R.array.topText_array);
        intent = new Intent(BROADCAST_ACTION);
    }

然后我进入了我的playSong()方法。这是每次用户对音频执行某些操作时调用的方法,因此我认为这将导致解决我的问题。

    public void playSong() {
        //other stuff    
        intent.putExtra("nowPlaying", topText[songPosn]);
        sendBroadcast(intent);
    }

然后在我的fragment.java文件中

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
         //other stuff
         broadcastReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    updateUI(intent);
                }
            };
    }

    private void updateUI(Intent intent){
        String nowPlaying = intent.getStringExtra("nowPlaying");
        songNowPlayingLabel.setText("Now Playing : " + nowPlaying);
    }