Android服务 - 意图不会在重新绑定时更新

时间:2014-07-07 13:35:55

标签: java android android-intent service

我有一个Activity B我不时地开始和停止。每当我开始B时,它会绑定ServiceMainActivityB开始,在离开时未绑定 {1}}。

每次我再次显示B时,它都会绑定Service,如下所示:

    Intent musicIntent = new Intent(this, MusicService.class);
    Bundle musicBundle = new Bundle();
    musicBundle.putStringArrayList("playlist", pathList);
    musicBundle.putInt("position", position);

    musicIntent.putExtras(musicBundle);
    getApplicationContext().bindService(musicIntent, mConnection,
            BIND_AUTO_CREATE);

因此,系统会调用onBind()onRebind()

服务:

@Override
public void onRebind(Intent intent) {
    super.onRebind(intent);

    Bundle extras = intent.getExtras();

    this.songPathList = extras.getStringArrayList("playlist"); //Is always the same
    this.position = extras.getInt("position"); //Is always the same
    this.isInitialzed = false; 
}

但是,我第一次绑定服务并将一些数据传递给它时,它就是最终的。意图的数据永远不会改变。因此,当调用onRebind()时,意图不会更改positionsongPathList

更清楚的是,我第一次调用B并通过意图传递一些数据。 position将被设置为5,songPathList将设置为一些随机的5个字符串。

现在我离开B并重新开始。这次将调用onRebind()。但是这一次positionsongPathList的值与以前不同。但是当我调试并检查onRebind()中的值时,它们还没有改变。 position仍然 5

我做错了什么?有谁知道为什么意图永远不会改变?

是的,当我再次B position时,{{1}}具有不同的值。

2 个答案:

答案 0 :(得分:0)

我没有证据,但我相信如果两个Intents之间的唯一区别是额外的,那么旧的将被重用,而不是创建一个新的Intent对象。

我知道PendingIntent s就是这种情况,不确定常规旧Intent是否也是如此。

我通过更新PendingIntent中的requestCode来解决此PendingIntent的限制,以便有明显不同的内容。

答案 1 :(得分:0)

好的,经过一些研究后我得到了答案。

来自“Android开发者”文档:

public void onRebind (Intent intent)
     

在新客户端连接到服务之后调用,之前已通知其所有已在其onUnbind(Intent)中断开连接。只有在重写onUnbind(Intent)的实现以返回true时才会调用此方法。

     

<强>参数

     

intent 用于绑定到此服务的Intent,如Context.bindService所示。 请注意,此处不会显示Intent中包含的任何额外内容。

正如我们所看到的 - 我们不应该将任何数据与绑定意图一起传递。

我真的不知道为什么这样做。我的解决方案是在Service中创建公共方法,以便在服务绑定到activity之后访问它,并在mConnection的 onServiceConnected 方法中调用这些方法:

在您的服务中:

...
private int position;
private List pathLish;

public void setData(int position, List pathList){
    this.position = position;
    this.pathList = pathList;
    Log.d(LOG_TAG, "Linked Chat Id now "+chatId);
}

在您的活动中:

 private Boolean bound = false;

 private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder service) {
        MusicServce.mBinder binder = (MusicServce.mBinder) service;
        musicService= binder.getService();
        musicService.setData(position, pathList);
        bound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        bound = false;
    }
};

@Override
protected void onStart() {
    super.onStart();
    Intent musicIntent = new Intent(this, MusicService.class);
    bindService(musicIntent, mConnection, BIND_AUTO_CREATE);
}