Android IPC 메커니즘 (2) Messenger IPC 구현
4920 단어 안드로이드 학습 노트프로세스 간 통신IPCMessenger
Messenger
Messenger的底层是通过AIDL实现的,我们可以通过他的构造函数了解,如下
public Messenger(Handler target) { mTarget = target.getIMessenger(); } public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); }
구체적인 코드 구현
서비스 단말기public class MessengerService extends Service { private static final String TAG="MessengerService"; private static class MessengerHandler extends Handler{ @Override public void handleMessage(Message msg) { switch (msg.what) { case Constants.MSG_FROM_CLIENT: // Log.e(TAG," :"+msg.getData().get("msg")); // messenger, Messenger client=msg.replyTo; Message message=Message.obtain(null,Constants.MSG_FROM_SERVICE); Bundle data=new Bundle(); data.putString("msg"," "); message.setData(data); try { client.send(message); } catch (RemoteException e) { e.printStackTrace(); } break; default: super.handleMessage(msg); } } } private final Messenger mMessenger=new Messenger(new MessengerHandler()); @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } }
클라이언트public class MessengerActivity extends AppCompatActivity { private static final String TAG="MessengerActivity"; private EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); mEditText=findViewById(R.id.edt_id); Intent intent=new Intent(this,MessengerService.class); bindService(intent, mServiceConnection,Context.BIND_AUTO_CREATE); } /** * Messenger */ private final Messenger mGetResult =new Messenger(new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case Constants.MSG_FROM_SERVICE: Log.e(TAG," :"+msg.getData().get("msg")); break; default: super.handleMessage(msg); } } }); private Messenger mService ;// Messenger private ServiceConnection mServiceConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService=new Messenger(service);// Messenger Message message=Message.obtain(null, Constants.MSG_FROM_CLIENT); Bundle bundle=new Bundle(); bundle.putString("msg",mEditText.getText().toString().trim()); message.setData(bundle); message.replyTo=mGetResult; try { mService.send(message);// } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; /** * * @param view */ public void sendMsg(View view) { Message message=Message.obtain(null, Constants.MSG_FROM_CLIENT); Bundle bundle=new Bundle(); bundle.putString("msg",mEditText.getText().toString().trim()); message.setData(bundle); message.replyTo=mGetResult; try { mService.send(message); } catch (RemoteException e) { e.printStackTrace(); } } @Override protected void onDestroy() { unbindService(mServiceConnection);//activity super.onDestroy(); } }
Manifest에서 다중 프로세스를 구현하도록 구성하는 장면
그러나 주의해야 할 것은 프로세스 간 통신을 할 때 Messenger는 메시지를 통해 전달되고 메시지가 사용할 수 있는 것은 what,arg1을 포함한다.
arg2, Bundle 및 replyTo, 그리고 object도 Parcelable를 실현한 시스템 대상만 전달할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 반사 메커니즘 문맹 퇴치반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법과 속성을 호출할 수 있다.이런 동적으로 얻은 정보와 동적 호출 대상의 방법의 기능을 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.