Faits: A. Le 23 avril 2009, A._ a été arrêté dans le cadre d'une instruction ouverte à la suite du décès de B._, tué par balles à son domicile de Genève-Cointrin dans la nuit du 25 au 26 novembre 2008. Le Juge d'instruction du canton de Genève en charge de l'affaire (ci-après: le juge d'instruction) l'a inculpé du meurtre, voire de l'assassinat de B._. Sur requête du juge d'instruction, la détention de A._ a été prolongée à plusieurs reprises. Par ordonnance du 26 janvier 2010, la Chambre d'accusation du canton de Genève (ci-après: la Chambre d'accusation) a prolongé de trois mois la détention du prévenu, en retenant l'existence d'un risque de collusion. Statuant sur recours de A._, le Tribunal fédéral a annulé cette ordonnance pour des raisons formelles liées à un défaut de motivation et il a renvoyé la cause à la Chambre d'accusation pour nouvelle décision (arrêt 1B_55/2010 du 11 mars 2010). B. Par ordonnance du 26 mars 2010, la Chambre d'accusation a confirmé la prolongation de la détention avant jugement de A._ accordée le 26 janvier 2010 pour une durée de trois mois, soit jusqu'au 26 avril 2010. Elle a admis l'existence de charges suffisantes à l'encontre de l'inculpé et elle a estimé que son maintien en détention préventive était justifié par les risques de collusion et de fuite. C. Agissant par la voie du recours en matière pénale, A._ demande au Tribunal fédéral d'annuler cette décision et d'ordonner sa mise en liberté immédiate. Il requiert en outre l'assistance judiciaire. Le Procureur général du canton de Genève se rallie aux arguments de la Chambre d'accusation et conclut au rejet du recours. La Chambre d'accusation se réfère aux considérants de la décision attaquée. Elle attire en outre l'attention du Tribunal fédéral sur les dernières pièces du dossier, en particulier l'ordonnance du 23 avril 2010 prolongeant la détention de A._ jusqu'au 23 juillet 2010. Le 6 mai 2010, le recourant a déposé des observations complémentaires et produit de nouvelles pièces à l'appui de celles-ci. 