当我尝试从活动绑定到服务时,我遇到了以下问题。
活动代码和此活动是TabActivity的一部分
public class SettingsActivity extends Activity{
private BkgService myBkgService;
Button BtnSubmit;
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.settings);
BtnSubmit = (Button)findViewById(R.id.XmlBtnSubmit);
BtnSubmit.setOnClickListener(onSubmit);
Intent bindIntent = new Intent(this, BkgService.class);
bindService(bindIntent, serviceConncetion, Context.BIND_AUTO_CREATE);
}
private ServiceConnection serviceConncetion = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBkgService = ((BkgService.MyBinder)service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myBkgService = null;
}
};
private OnClickListener onSubmit = new OnClickListener() {
@Override
public void onClick(View v) {
myBkgService.startCounting();
}
};
}
现在,我的服务代码如下所示
public class BkgService extends Service{
private IBinder mBinder;
private int i;
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent arg0) {
return mBinder;
}
public class MyBinder extends Binder {
BkgService getService() {
return BkgService.this;
}
}
public int startCounting(){
return i=i+1;
}
}
现在当我在我的活动中点击我的BtnSubmit时,我收到了NullPointerException。我检查了它是因为在myBkgService.startCounting()
中myBkgService
为空。我无法找出为什么我得到这个空指针。我的活动是否未正确绑定到该服务。请建议一些解决方案。我被困在这里。
答案 0 :(得分:1)
尝试这种方式:
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.settings);
BtnSubmit = (Button)findViewById(R.id.XmlBtnSubmit);
BtnSubmit.setOnClickListener(onSubmit);
serviceConncetion = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBkgService = ((BkgService.MyBinder)service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myBkgService = null;
}
};
Intent bindIntent = new Intent(this, BkgService.class);
bindService(bindIntent, serviceConncetion, Context.BIND_AUTO_CREATE);
}
答案 1 :(得分:0)
确保在AndroidManifest.xml中声明您的服务。如果不这样做,那么对bindService的调用将返回false。
我还注意到你没有初始化你的mBinder,你的BkgService需要以下内容。
private IBinder mBinder = new MyBinder();