programing tip

Android에서 ResultReceiver 사용

itbloger 2020. 12. 7. 07:55
반응형

Android에서 ResultReceiver 사용


기본적으로 IntentService에서 활동에 대한 콜백을 설정하고 싶습니다. 내 질문은 여기에 대답 한 것과 매우 유사합니다.

편안한 API 서비스

그러나 응답 코드에서 활동 코드는 ResultReceiver를 구현하는 것으로 간주됩니다. 내가 뭔가를 놓친 것이 아니라면 ResultReceiver는 실제로 클래스이므로이 구현을 수행 할 수 없습니다.

따라서 본질적으로 ResultReceiver를 해당 서비스에 연결하는 올바른 방법이 무엇인지 묻습니다. 이와 관련하여 Handler 및 ResultReceiver 개념과 혼동됩니다. 작동하는 모든 샘플 코드를 주시면 감사하겠습니다.


  1. ResultReceiver에서 확장 된 사용자 정의 resultreceiver 클래스를 만들어야합니다.

  2. 그런 다음 활동에서 resultreceiver 인터페이스를 구현합니다.

  3. 사용자 정의 resultreceiver 객체를 intentService에 전달하고 intentservice에서 수신자 객체를 가져오고 receiver.send () 함수를 호출하여 Bundle 객체의 호출 활동에 무엇이든 전송하십시오.

    다음은 customResultReceiver 클래스입니다.

     public class MyResultReceiver extends ResultReceiver {
    
        private Receiver mReceiver;
    
        public MyResultReceiver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
    
        public interface Receiver {
            public void onReceiveResult(int resultCode, Bundle resultData);
    
        }
    
        public void setReceiver(Receiver receiver) {
            mReceiver = receiver;
        }
    
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
    
            if (mReceiver != null) {
                mReceiver.onReceiveResult(resultCode, resultData);
            }
        }
    
    }
    

활동에서 Myresultreceiver.receiver 인터페이스를 구현하고 클래스 변수를 만듭니다.

Public MyResultReceiver mReceiver;

onCreate에서이 변수를 초기화합니다.

mReceiver = new MyResultReceiver(new Handler());

mReceiver.setReceiver(this);

다음을 통해이 mReceiver를 intentService에 전달합니다.

intent.putExtra("receiverTag", mReceiver);

IntentService에서 다음과 같이 가져옵니다.

ResultReceiver rec = intent.getParcelableExtra("receiverTag");

rec를 사용하여 활동에 무엇이든 보내십시오.

Bundle b=new Bundle();
rec.send(0, b);

이것은 활동의 onReceiveResult에서 수신됩니다. 전체 코드는 다음에서 볼 수 있습니다. IntentService : 활동에 데이터 다시 제공

편집 : 누수를 방지하려면 onResume에서 setReceiver (this)를 호출하고 onPause ()에서 setReceiver (null)을 호출해야합니다.


서브 클래 싱으로 메서드를 재정의합니다. 이를 위해 인터페이스가 될 필요는 없습니다.

예를 들면 :

intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultCode == StockService.RESULT_ID_QUOTE) {
            ...
        }
    }
});

I have created a simple example that demonstrates how to use ResultReceiver.

MainActivity:

public class MainActivity extends AppCompatActivity {

    private final static String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent serviceIntent = new Intent(this, MyService.class);
        serviceIntent.putExtra("logName", "MAIN_ACTIVITY");
        serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) {
            @Override
            protected void onReceiveResult(int resultCode, Bundle resultData) {
                super.onReceiveResult(resultCode, resultData);

                if (resultCode == Activity.RESULT_OK) {
                    String val = resultData.getString("value");
                    Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]");
                } else {
                    Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++");
                }
            }
        });
        startService(serviceIntent);
    }
}

MyService:

public class MyService extends Service {

    private final static String TAG = MyService.class.getSimpleName();
    public final static String BUNDLED_LISTENER = "listener";

    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String logName = intent.getStringExtra("logName");
        ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER);

        Bundle bundle = new Bundle();
        bundle.putString("value", "30");
        receiver.send(Activity.RESULT_OK, bundle);
        return Service.START_NOT_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

for use Resulteceiver in android

  1. Create SomeResultReceiver extends from resultReceiver

  2. Create interface someReceiver with on method for example onReceivResult(int resultCode,Bundle resultData);

3.use someReceiver in someResultreceiver

  1. create someService extends IntentService and use someresultReceiver.send() method for send result from service to someOne class (ex: MyActivity)

  2. Implement somereceiver on Activity

6.instantiation someResultReceiver in MyActivity class and setreceiver

  1. startService with Intent and putExtra someResultreceiver instanse

for more details ResultReceiver Class see enter link description here

참고URL : https://stackoverflow.com/questions/4510974/using-resultreceiver-in-android

반응형