As @Penman said, you should use a service (here, I used a factory).
A very simple use case is to have a service with a method that log something. Then we use this service from 2 different modules. 
Here's how I did it :
index.html
<body>
  <div ng-app="appOne">
    <div ng-controller="appOneCtrl">
      {{ name }} <button ng-click="log()">Log</button>
    </div>
    <div ng-app="appTwo">
      <div ng-controller="appTwoCtrl">
        {{ name }} <button ng-click="log()">Log</button>
      </div>
    </div>
  </div>
</body>
script.js
// APP 1
const app1 = angular.module('appOne', ['appTwo']);
app1.controller('appOneCtrl', function($scope, $log, sharedFactory) {
  $scope.name = 'App 1, ctrl 1';
  $scope.log = () => {
    $log.info('Click on log button from appOne');
    sharedFactory.logMeSomething();
  };
});
// -----------------------------------------
// APP 2
const app2 = angular.module('appTwo', []);
app2.controller('appTwoCtrl', function($scope, $log, sharedFactory) {
  $scope.name = 'App 2, ctrl 2';
  $scope.log = () => {
    $log.info('Click on log button from appTwo');
    sharedFactory.logMeSomething();
  };
});
app2.factory('sharedFactory', function($log) {
  return {
    logMeSomething: () => {
      $log.debug('Something logged from sharedFactory !');
    }
  };
});
Clicking on "Log 1" button displays : 
Click on log button from appOne
Something logged from sharedFactory !
Clicking on "Log 2" button displays : 
Click on log button from appTwo
Something logged from sharedFactory !
Here's a working Plunkr of my solution :
https://plnkr.co/edit/sgOKkh0eh0URPGIP9dZY?p=preview