Roy's 120 and stand-in captain Jos Buttler's 91 not out took England to a total of 342 for eight as the hosts went 2-0 up in this five-match series.
Australia opener Shaun Marsh made 131 to became the first Glamorgan batsman to score an international century at the Welsh county's Sophia Gardens headquarters.
But their 304 all out meant world champions Australia had suffered a seventh defeat in their last eight ODI matches.
The Yorkshire duo of fast bowler Liam Plunkett (four for 53) and leg-spinner Adil Rashid (three for 70) shared seven wickets as England won with 17 balls to spare.
It was just over a year ago in Cardiff that struggling Surrey opener Roy, 27, was dropped from the England side that suffered an eight-wicket defeat in the semi-finals of the Champions Trophy by Pakistan, the eventual tournament winners.
Roy though regained his place in and on Saturday he scored 120 -- his fifth hundred in 60 ODIs.
It was also his first since he made an England record 180 against Australia in Melbourne in January.
Wicket-keeper Buttler, captaining 2019 World Cup hosts England after regular ODI skipper Eoin Morgan was ruled out with a back spasm shortly before the toss, followed up with a 70-ball knock that included two extravagant ramped sixes off successive deliveries from paceman Jhye Richardson.
The most Australia have ever made batting second to win an ODI is the 334 for eight they made against England at Sydney in 2011.
Despite Marsh's heroics, an Australia side missing star batsmen Steve Smith and David Warner, both given year-long bans for their roles in the Cape Town ball-tampering fiasco in March, just fell short.
Roy and Jonny Bairstow (42) got England off to a brisk start as, Australia, also without their injured Ashes-winning pace attack of Mitchell Starc, Pat Cummins and Josh Hazlewood, failed to gain the swing captain Tim Paine had hoped for when he won the toss in overcast conditions.
Roy, completed a 52-ball fifty before launching Marcus Stoinis into the River Taff End with a superb straight six.
The first of two rain breaks came when Roy was on 66 not out.
But soon after play resumed, Roy pulled Andrew Tye for six.
Come a second rain break, Roy was 91 not out.
He kept his concentration and pushed left-arm spinner Ashton Agar for two past point to complete a 97-ball century including nine fours and two sixes.
Roy was eventually dismissed during an eventful 36th over.
Wicket-keeper Paine was struck a nasty blow in the face when a legside wide from Tye bounced unexpectedly high just in front of his gloves.
Two deliveries later, Roy drove Tye for a majestic four through the covers.
But next ball he was out when Tye took the edge and Paine held a superb one-handed catch as he dived to his left.
Marsh was dropped twice at midwicket by Bairstow and substitute Tom Curran on his way to a 95-ball century, that included 10 fours and three sixes.
Agar (46) offered Marsh excellent support in a sixth-wicket stand of 96 before he was stumped by Buttler off Rashid.
The wicket England needed came when Plunkett bowled Marsh with a full delivery to leave Australia 293 for eight.
England, who beat Australia 4-1 in an ODI series 'Down Under' in January, will take an unassailable 3-0 lead if they win Tuesday's day/night clash in Nottingham.
cardiff odiEngland vs AustraliaEngland vs Australia 2018england vs australia live updateeoin morganGlenn Maxwelljason royJoe RootJos ButtlerMoeen Alishaun marshTim Paine
First Published: June 17, 2018, 7:53 AM IST