从活动绑定到服务时获取NullPointerException

时间:2012-03-03 13:51:43

标签: android binding service android-activity

当我尝试从活动绑定到服务时,我遇到了以下问题。

活动代码和此活动是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为空。我无法找出为什么我得到这个空指针。我的活动是否未正确绑定到该服务。请建议一些解决方案。我被困在这里。

2 个答案:

答案 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();