마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

서비스에 바인드하여 서비스의 메서드 호출하기!

0 추천

서비스에 바인드하려고 시도중입니다.

메인액티비티에서 서비스에 바인드 후 서비스 내의 메서드를 호출하려는데

서비스와 바인드하기 위해 정의한 서비스 객체가 null로 잡힙니다.

아래는 코드입니다.

public class MainActivity extends AppCompatActivity{
    DataService mService;
    int k = 0;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent is = new Intent(this, DataService.class);
        bindService(is,conn,Context.BIND_AUTO_CREATE);

        Toast.makeText(this, "서버와 연결중입니다.",Toast.LENGTH_SHORT).show();      
    }
//성공시 1 실패 2
    @Override
    protected void onStart() {
        super.onStart();
        
    }


    ServiceConnection conn = new ServiceConnection() {
        public void onServiceConnected(ComponentName name,IBinder service) {
            DataService.MBinder mb = (DataService.MBinder) service;
            mService = mb.getService(); 
        }

        public void onServiceDisconnected(ComponentName name) {
            // 서비스와 연결이 끊겼을 때 호출되는 메서드
            Toast.makeText(getApplicationContext(),
                    "서비스 연결 해제",Toast.LENGTH_LONG).show();
        }};}
여기까지가 메인 액티비티입니다. 아래는 서비스입니다.

 

public class DataService extends Service {
 static ChkData checker;
 static int LoginChecker = 0;
 static boolean socketChecker = false;
 static int signinChecker = 0;



 IBinder mBinder = new MBinder();

 public class MBinder extends Binder {
     DataService getService() {

         return DataService.this;
     } }
@Override
public IBinder onBind(Intent intent) {
    // Service 객체와 (화면단 Activity 사이에서)
    // 통신(데이터를 주고받을) 때 사용하는 메서드
    // 데이터를 전달할 필요가 없으면 return null;
    return mBinder;
}
 

호출하는 메서드는 서비스에 정의된 메서드로, 매개변수를 메인액티비티에서 참조할 계획입니다.

디버그하여 자세히 보니 바인드 서비스 메서드가 호출된 후에도

메인액티비티의 mService가 null이더군요...

고수님들의 지식을 빌려보고싶습니다!

아 혹시나 해서 적습니다. 메니페스트에도 이렇게 추가해두었어요. 

<service android:name=".DataService" />

 

 

 

 

 

 

 

 

 

 

 

smartdevel (570 포인트) 님이 2018년 7월 30일 질문

2개의 답변

+1 추천
 
채택된 답변
bindService가 호출된 후가 아니라 onServiceConnected가 호출된후에 mService에 오브젝트가 들어오겠죠. bindService후 onServiceConnected가 호출될때까지 약간의 딜레이가 있습니다.

Service 설정이 잘못되었다면 bindService에서 false를 return할수 있으니 bindService의 return 값도 확인해보세요. true가 잘 오고 있으면 onServiceConnected가 잘 호출되는지 확인하시구요.
회색 (21,340 포인트) 님이 2018년 8월 1일 답변
smartdevel님이 2018년 8월 2일 채택됨
답변해주셔서 감사합니다.
0 추천

위에 코드는 오류가 없어 보입니다. 서비스에 테스트 함수 만들고  onServiceConnected에서 서비스 함수 호출해 보시면 될것 같네요

luxsoft (1,780 포인트) 님이 2018년 8월 1일 답변
...