BindService의 몇 가지 사용 방법

7313 단어

바인딩 서비스


귀속 서비스는 클라이언트-서버 인터페이스의 서버입니다.바인딩 서비스는 구성 요소(예를 들어 Activity)를 서비스에 바인딩하고 요청을 보내며 응답을 수신하고 심지어 프로세스 간 통신(IPC)을 실행할 수 있습니다.귀속 서비스는 일반적으로 다른 응용 프로그램 구성 요소를 위한 서비스에서만 활성화되며 백그라운드에서 무제한으로 실행되지 않습니다.

Sevice


다음 서비스는 클라이언트가 Binder를 통해 서비스에 접근하는 방법을 실현할 수 있습니다
    public class LocalService extends Service {
        IBinder mBinder = new LocalBinder();
        private final Random mGenerator = new Random();
    
        public class LocalBinder extends Binder {
            LocalService getService() {
                return LocalService.this;
            }
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return mBinder;
        }
    
        public int getRandomNumber() {
            return mGenerator.nextInt(100);
        }
    }

Client

    public class MainActivity extends Activity {
        LocalService mService;
        Button button;
        Boolean mBound;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mBound) {
                        int num = mService.getRandomNumber();
                        Toast.makeText(getApplicationContext(), String.valueOf(num), Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Intent intent = new Intent(this, LocalService.class);
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            unbindService(mConnection);
        }
    
        private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                LocalService.LocalBinder binder = (LocalService.LocalBinder) iBinder;
                mService = binder.getService();
                mBound = true;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                mBound = false;
    
            }
        };
    }

MessagerSevice


다음은 Messenger 인터페이스를 사용하는 간단한 서비스 예입니다.

    public class MessengerService extends Service {
        static final int MSG_SAY_HELLO = 1;
    
        Messenger mMessenger = new Messenger(new IncomingHandler());
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
            return mMessenger.getBinder();
        }
    
        class IncomingHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_SAY_HELLO:
                        Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        super.handleMessage(msg);
                }
            }
        }
    }

ActivityMessager


클라이언트는 서비스가 되돌아오는 IBinder에 따라 Messenger를 만들고 send () 를 이용하여 메시지를 보내기만 하면 됩니다.예를 들어 다음은 서비스에 귀속되어 서비스에 MSG_를 전달하는 것입니다SAY_HELLO 메시지의 간단한 액티비티:

    public class ActivityMessenger extends Activity {
        Messenger mService = null;
        boolean mBound;
        Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (!mBound)
                        return;
                    Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
                    try {
                        mService.send(msg);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
    
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Intent intent = new Intent(this, MessengerService.class);
            bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
        }
    
        ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                mService = new Messenger(iBinder);
                mBound = true;
            }
    
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                mBound = false;
                mService = null;
            }
        };
    
        @Override
        protected void onStop() {
            super.onStop();
            if (mBound) {
                unbindService(mServiceConnection);
                mBound = false;
            }
        }
    
    }

참고: Activity, 서비스 및 콘텐츠 제공자만 서비스에 연결할 수 있습니다. 브로드캐스트 수신기에서 서비스에 연결할 수 없습니다.

서비스에 바인딩


따라서 클라이언트에서 서비스에 연결하려면 다음을 수행해야 합니다.
  • Service Connection 구현..
  • bindService()를 호출하여 ServiceConnection을 전달합니다
  • 시스템이 onServiceConnected () 리셋 방법을 호출할 때, 인터페이스가 정의한 방법으로 서비스를 호출할 수 있습니다
  • 서비스와의 연결을 끊으려면 unbindService () 를 호출합니다

  • 추가 설명

  • 데드 Object Exception 이상을 항상 포착해야 합니다. 연결이 끊겼을 때 발생하는 이상입니다.이것은 원격 방법이 일으킨 유일한 이상이다
  • 대상은 크로스 프로세스 계수의 인용이다
  • Activity가 백그라운드에서 실행 중지된 상태에서도 응답을 받을 수 있도록 하려면 onCreate () 에서 바인딩하고 onDestroy () 에서 바인딩을 취소합니다.이것은 귀하의 Activity가 전체 운행 과정 (심지어 백그라운드 운행 기간 포함) 에서 서비스를 사용해야 한다는 것을 의미합니다. 따라서 서비스가 다른 프로세스에 있으면 프로세스의 권한을 높일 때 시스템이 프로세스를 종료할 가능성이 증가합니다

  • 참고: 일반적으로 Activity의 onResume() 및 onPause() 기간에 귀속을 연결하거나 취소하지 마십시오. 매번 생명주기 변환이 발생하기 때문에 이 변환 기간에 발생하는 처리를 최저 수준으로 유지해야 합니다.또한 응용 프로그램 내의 여러 액티비티가 같은 서비스에 연결되고 두 액티비티 사이에 전환이 발생하면 현재 액티비티가 다음 귀속(복구 기간) 전에 귀속을 취소하고 (일시 중지 기간) 서비스를 삭제하고 서비스를 재구성할 수 있습니다.Activity 문서에서는 이러한 Activity가 라이프 사이클의 Activity 변환을 조정하는 방법에 대해 설명합니다.

    바인딩 서비스의 라이프 사이클 관리

  • 서비스와 모든 클라이언트 간의 귀속이 모두 취소되면 Android 시스템은 서비스를 삭제합니다(onStartCommand () 를 사용하여 이 서비스를 시작하지 않는 한)
  • 단, onStartCommand () 리셋 방법을 선택하면 현재 서비스가 시작된 것으로 간주되기 때문에 서비스를 현저하게 중단해야 합니다.이 경우, 서비스는 stopSelf () 를 통해 자동으로 멈추거나 다른 구성 요소가 stopService () 를 호출할 때까지 실행됩니다
  • 또한 서비스가 시작되고 귀속을 수락한 경우, 시스템이 onUnbind () 방법을 호출할 때, 클라이언트가 다음에 서비스에 귀속될 때 onRebind () 호출 (onBind () 호출 대신 onRebind () 호출) 을 받으려면true로 돌아갈 수 있습니다.onRebind()는 빈 값을 반환하지만 클라이언트는 onServiceConnected() 콜백에서 IBinder를 수신합니다.다음 그림1은 이러한 생명주기의 논리를 설명한다
  • 좋은 웹페이지 즐겨찾기