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

액티비티와 서비스간 인텐트 값 넘기기

+1 추천
액티비티에 스트링 값을 위젯을 구현하는 클래스안에 서비스 클래스로 보내려고 합니다.
액티비티에서는
Intent it = new Intent(ExampleActivity.this, ExampleAppWidgetProvider.UpdateService.class);
it.putExtra("position", location_position);
startService(it);
으로 보냈구요.

서비스 에서는
@Override
      public void onStart(Intent intent, int startId){     
         mHandler.postDelayed(this, 1000);
         dong = intent.getStringExtra("position");
      }
에서 받아옵니다. 위젯이 계속 업데이트 되야 하기 때문에 서비스에 쓰레드를 인터페이스로 받아왓는데 토스트 창으로 확인해 보니 아무 값을 못 받아 옵니다.
익명사용자 님이 2014년 7월 17일 질문

2개의 답변

0 추천
aucd29 (214,850 포인트) 님이 2014년 7월 17일 답변
aidl 을  안 쓰고 하는 방법은 없을까요 ㅜ?
0 추천
onStart 가 아니라 onStartCommand 메소드로 구현해야 합니다.

http://developer.android.com/reference/android/app/Service.html#onStartCommand%28android.content.Intent,%20int,%20int%29

그리고, 이 때 onStartCommand 의 반환값 (START_STICKY/START_NONSTICKY 등) 에 유의하세요.
매발톱 (1,460 포인트) 님이 2014년 7월 17일 답변
onStart 를 지우고 onStartCommand 를 사용 하여도 똑같이 값을 못 넘겨 받습니다. 리턴값 또한 둘다 해보았는대도 안되는군요..ㅜ
앗. 그러고보니 서비스를 위젯 안에 내부 클래스로 구현한 거군요.
그럼 이 서비스는 manifest 파일에 등록이 되어 있지 않은 건가요?
등록이 되어 있지 않으면 안드로이드가 서비스를 찾아서 실행할 수 없을 것 같네요. 그리고, 설사 찾더라도 내부 클래스에서 실행가능한지도 모르겠구요.
차라리 액티비티에서 서비스로 바로 보내지 말고 AppWidgetProvider 로 브로드캐스트 이벤트를 보내고 AppWidgetProvider 가 서비스를 시작하는 방법을 쓰면 어떨까요?
http://ironpapa.tistory.com/38
http://aroundck.tistory.com/186
액티비티
final Context context = ExampleActivity.this;               
                AppWidgetManager widgetMgr = AppWidgetManager.getInstance(context);

                //widget Provider에서 사용자가 정의한 함수를 호출하여 값을 넘겨준다.
                ExampleAppWidgetProvider.updateWidget(context,widgetMgr,mAppWidgetId);
                // Make sure we pass back the original appWidgetId
                Intent resultValue = new Intent();
                resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
                resultValue.putExtra("position", location_position);
                setResult(RESULT_OK, resultValue);
                ExampleActivity.this.sendBroadcast(resultValue);

providor

BroadcastReceiver b = new BroadcastReceiver() {
           
            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                dong = intent.getStringExtra("position");
            }
        };
        IntentFilter filter = new IntentFilter();
        context.registerReceiver(b,filter);
        endServiceFlag = false;
        Intent it =new Intent(context, UpdateService.class);
        it.putExtra("position", dong);
        mService = context.startService(it);

서비스에 안보내집니다.ㅜㅜ
위 코드 중 제일 아래 6줄은 onReceive 메소드 안에 넣고 manifest 파일에 서비스 등록하시고 실행해 보시죠.
...