我有一个Activity B
我不时地开始和停止。每当我开始B
时,它会绑定到Service
,MainActivity
从B
开始,在离开时未绑定 {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()
时,意图不会更改position
和songPathList
。
更清楚的是,我第一次调用B并通过意图传递一些数据。 position
将被设置为5,songPathList
将设置为一些随机的5个字符串。
现在我离开B
并重新开始。这次将调用onRebind()
。但是这一次position
和songPathList
的值与以前不同。但是当我调试并检查onRebind()
中的值时,它们还没有改变。 position
仍然 5 。
我做错了什么?有谁知道为什么意图永远不会改变?
是的,当我再次B
position
时,{{1}}具有不同的值。
答案 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);
}