Android의 BindService 앱을 Delphi로 만들어 보았습니다.

Android의 StartService 앱을 Delphi로 만들어 보았습니다. 」를 썼으므로, ​​또 하나의 BindService도 쓰지 않으면

BindService는 StartService와 마찬가지로 앱에서 시작됩니다.
BindService에서 서비스에 연결하고 UnBindService에서 서비스와의 연결을 끊습니다.
StartService 가 스스로 정지하는 것과 달리, BindService 의 경우는, 다른 것으로부터 사용되고 있는 한 실행해 계속해, 누구로부터도 사용되지 않게 되면, 서비스를 파기합니다
참고 : Android Developer - Service

어떤 앱을 만드는가?



Android의 StartService 앱을 Delphi로 만들어 보았습니다.로 만든 앱 서비스를 수정하고 확장합니다.
수정·확장하므로 메인 앱에 서비스를 등록하는 작업을 다시 할 필요가 없습니다.
수정 · 확장 내용이지만
  • 메인 앱은 BindService 버튼을 누르면 서비스를 시작하고 BindService로 서비스에 연결합니다.
  • 메인 앱은 UnBindService 버튼을 누르면 서비스와의 연결이 끊어집니다.
  • 서비스 측은 BindService의 기능을 추가하지만 동일한 방식으로 알림을 제공합니다.
  • 서비스 측에서는 해제 = 서비스 정지로 합니다

  • 메인 측 화면 확장



    버튼을 1개, 새롭게 배치하는 것만으로 간단한 일
    이해하기 쉽도록 BindService, UnBindService 및 Text 속성 변경


    메인 측 동작 확장



    BindService 버튼의 클릭 이벤트를 다음과 같이 수정합니다.
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Service 起動
      if mService = nil then begin
        mService := TLocalServiceConnection.Create;
        mService.StartService('Project2');
      end;
    
      // Service に Bind
      mService.BindService('Project2', 0);
    end;
    

    UnBindService 버튼의 클릭 이벤트를 다음과 같이 작성합니다.
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if mService <> nil then begin
        mService.UnbindService;  // Service との接続解除
        mService := nil;
      end;
    end;
    

    서비스 측 확장



    DM (TDM)에 새 OnBind 이벤트와 OnUnBind 이벤트 추가


    OnStartCommand 이벤트의 코드를 다음과 같이 수정합니다.
    function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;
    begin
      // サービスの開始
      // StartService は result を返す
      Result := TJService.JavaClass.START_STICKY;
    end;
    

    OnBind 이벤트의 코드를 다음과 같이 작성합니다.
    function TDM.AndroidServiceBind(const Sender: TObject; const AnIntent: JIntent): JIBinder;
    var
      mNotice: TNotification;
    begin
    
      // BindService として通知の実行
      mNotice := NotificationCenter1.CreateNotification;
      mNotice.Title := 'BindService通知';
      mNotice.AlertBody := 'メッシャアーッ';
      NotificationCenter1.PresentNotification(mNotice);
      mNotice.DisposeOf;
    
      // IBinder オブジェクトを戻り値として返す
      Result := GetBinder;
    end;
    
    

    OnUnBind 이벤트의 코드를 다음과 같이 작성합니다.
    function TDM.AndroidServiceUnBind(const Sender: TObject; const AnIntent: JIntent): Boolean;
    begin
    // このサンプルでは解除=停止
    // サービスの停止
      JavaService.stopService(AnIntent);
      Result := False;
    end;
    

    움직여 보자



    우선은 어플리 기동


    BindService를 탭하면 서비스가 시작되고 해당 서비스에 연결되어 "알림"이 발생합니다.


    알림 내용


    UnBindService를 탭하면 서비스와의 연결을 끊고 서비스를 중지합니다.


    BindService 버튼을 계속해서 두 번 탭해도 알림은 하나뿐입니다.
    이것은 아직 Bind가 해제되지 않았기 때문에 OnBind 이벤트가 발생하지 않습니다.
    UnBindService 버튼을 탭한 다음 BindService 버튼을 탭하면 OnBind 이벤트가 발생하여 알림을 받습니다.

    참고



    BindService 라이프사이클
    Android Developer



    후기



    Delphi에서 Android 서비스를 만들 때 네 가지 선택
  • 로컬 서비스
  • 인텐트 로컬 서비스
  • 원격 서비스
  • 인텐트 원격 서비스

  • 나온다.

    '로컬'과 '원격'의 차이는
    로컬 - 해당 앱에서만 사용할 수 있는 private 서비스
    원격 - public이며 다른 앱에서 액세스 할 수 있습니다.
    입니다

    "인텐트 xxxx 서비스"는 서비스에서 IntentService을 사용하려면 선택합니다.
    IntentService는 백그라운드에서 특정 작업을 수행하고 작업자 스레드에서 작업 대기열을 수신 순서대로 처리합니다.
    서비스의 정지는 큐내의 작업이 모두 끝났을 때에 자동적으로 행해지므로, 명시적으로 정지할 필요는 없습니다

    좋은 웹페이지 즐겨찾기