My approach would be to have one bone as root to move the whole thing around, a second bone is then attached to the arm to control lifting it up. I placed a Limit Rotation constraint on this so that it can only be moved within a reasonable range of motion.
For the hydraulics lifting the arm, I have two empties (shown as circles), one is parented to the arm, the other to the main chassis. A cylinder is then made as a child of each with a TrackTo constraint that keeps it pointed at the opposing empty.

As the arm is raised and lowered, these piston pieces imitate the hydraulic piston.

The bone for the "pivot" arm that is used to rotate the bucket is simply an unconnected child of the arm bone, again I have a Limit Rotation constraint to keep it sane.

For the bucket I have another unconnected bone that is also a child of the arm bone. To this I have added a Transformation constraint. While this constraint can be hard to grasp, it takes an input transform and maps it to the output transform, the input and output do not have to be the same type or axis, but in this case I use it to vary the ratio of movement. A little experimenting and I found moving the pivot bone between 20 and -20 degrees and having the bucket to move between -28 and 28 degress gives a close to static length in the connection between the pivot arm and the bucket. Note that I inverted the angle values so that the rotation happens in the opposite direction.


Similar to the arm hydraulics I have a cylinder with a TrackTo constraint, but here I only have the one.
With this setup you animate the main arm bone to raise and lower the whole mechanism and animate the pivot arm bone to adjust the bucket position.

I have parented the various parts to the bones, the same constraints could be applied directly to objects without using an armature.
