Android Service는 Messenger를 사용하여 프로세스 간 통신 프레임워크
서비스 사이드 모델
public class BackgroundService extends Service
{
private Messenger mMessenger = null;//
private Messenger replyMessenger = null //
@Override
public IBinder onBind(Intent intent)
{
if(mMessenger==null)
{
mMessenger = new Messenger(new ServerHandler());
}
return mMessenger.getBinder();
}
@Override
public boolean onUnbind(Intent intent)
{
return super.onUnbind(intent);
}
// , ServerHandler ,
public static class ServerHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
if (msg.what == 0x000001)
{
try
{
replyMessenger = msg.replyTo;
replyMessenger.send(Message.obtain(null,0x000001, HttpStatus.SC_OK, 0));
LogUtils.e("[ ]=> , <MSGID[FlightID:"+msg.obj+",arg1:"+msg.arg1+"]>");
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
else if(msg.what == 0x000002)
{
try
{
replyMessenger = msg.replyTo;
replyMessenger .send(Message.obtain(null,0x000002,HttpStatus.SC_OKT, 0));
LogUtils.e("[ ]=> , <MSGID[FlightID:"+msg.obj+",arg1:"+msg.arg1+"]>");
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
else
{
super.handleMessage(msg);
}
}
}
}
클라이언트 모델
public class MainActivity extends Activity
{
private Activity activity = null;
private final int RETRY_INTERVAL_TIME = 2 * 1000;
private final Messenger clientMessenger= new Messenger(new ClientHandler());
private Messenger replyMessenger = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
activity = this;
startBackgroundService(this);
// ,
bindgroundService();
}
public static class ClientHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
if (msg.what == HttpStatus.SC_OK)
{
//msg.arg1 remoteInt
Log.i("TAG", " :"+msg.arg1);
} else {
super.handleMessage(msg);
}
}
}
/** */
private ServiceConnection serviceConnection = new ServiceConnection()
{
@Override
public void onServiceDisconnected(ComponentName name)
{
replyMessenger = null;
LogUtils.d("ServiceClient>>service onServiceDisconnected : ");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
replyMessenger = new Messenger(service);
LogUtils.d("ServiceClient>>service onServiceConnected : ");
if(replyMessenger !=null)
{
LogUtils.e("[ ]==> , , !");
Message msgTo = Message.obtain(null,200);
msgTo.obj = "[ ]";
msgTo.arg1 = 1024;
msgTo.replyTo = clientMessenger;
try
{
rccBackgroundService.send(msgTo);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
};
/**
*
* @param context
*/
private void startBackgroundService(Context context)
{
if(!isServiceRunning(BackgroundService.class.getName(),context))
{
Intent targetIntent = new Intent(context,RCCBackgroundService.class);
//targetIntent.setAction(TARGET_SERVICE_ACTION);
context.startService(targetIntent);
}
}
/**
*
*/
private void bindgroundService()
{
if(rccBackgroundService==null && isServiceRunning(BackgroundService.class.getName()))
{
Log.e("[ ]","[ ]");
activity.getWindow().getDecorView().postDelayed(new Runnable()
{
@Override
public void run()
{
Intent intent = new Intent(activity, BackgroundService.class);
intent.setAction(WifiNetworkChangedReceiver.TARGET_SERVICE_ACTION);
activity.bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
}
}, RETRY_INTERVAL_TIME);
}else{
activity.getWindow().getDecorView().postDelayed(new Runnable() {
@Override
public void run() {
rccBackgroundService = null;
bindgroundService();
}
}, RETRY_INTERVAL_TIME);
}
}
/**
* Service
* @param serviceClassName
* @return
*/
public boolean isServiceRunning(String serviceClassName)
{
final ActivityManager activityManager = (ActivityManager)activity.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
for (RunningServiceInfo runningServiceInfo : services)
{
if (runningServiceInfo.service.getClassName().equals(serviceClassName))
{
LogUtils.e("-ServiceClient-> , ");
return true;
}
}
LogUtils.e("->ServiceClient-> , !");
return false;
}
}
---------------------------------------------------------------------
의문에 대해 Messenger를 사용하는 것은 AIDL의 편리함이 없다. AIDL은 IPC 에이전트 방식이기 때문에 상황에 따라 결정해야 한다. 소형 프로젝트에 대해서는 IPC 에이전트를 사용할 필요가 없지만 큰 프로젝트에 대해서는 IPC 에이전트를 사용하는 것이 가장 좋다. 왜냐하면 IPC 에이전트는 인터페이스를 위한 서비스이기 때문이다.
참고: Messenger와 AIDL의 관계에서 그들은 모두 Parcelable를 사용하여 복잡한 유형의 데이터를 전달할 수 있으며 AIDL은 상대적으로 밑바닥이고 유연성이 좋다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
크로스 프로세스에 대한 관찰자 모드같은 프로세스 안에 없기 때문에 등록된 리셋은 크로스 프로세스를 전송해야 한다. 하나는 Binder이고 다른 하나는 Binder의 Proxy이다.같은 리셋이 여러 프로세스를 통해 전송되고 수신자는 매번 다른 Prox...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.