Od 1977 roku pracował w Instytucie Historii Nauki i Oświaty PAN, a od 1980 wykładał na Wydziale Filozoficznym oo. Jezuitów (późniejsza Wyższa Szkoła Filozoficzno-Pedagogiczna, a obecnie Akademia Ignatianum). Przez jedną kadencję był tam prorektorem (2003–2007). Od 2003 roku wykłada w Państwowej Wyższej Szkole Wschodnioeuropejskiej w Przemyślu, a także na Uniwersytecie Papieskim Jana Pawła II w Krakowie (2014–2015).
Jest autorem szeregu publikacji naukowych oraz książek, m.in.: Oświata i popularyzacja nauki w Galicji w okresie autonomii, Profesorowie UJ w aktach UB i SB, Miecz i tarcza komunizmu. Historia aparatu bezpieczeństwa w Polsce 1944-1990.
Jako publicysta współpracował z wieloma czasopismami. Był zastępcą redaktora naczelnego „Czasu Krakowskiego” (1990–1992) i redaktorem naczelnym „Nowin” (1996–1998), publikował także w roczniku „Studia Rzeszowskie” oraz półroczniku „Horyzonty Wychowania”. W latach 1995–1998 był przewodniczącym rady programowej Radia Kraków.
Od 2001 roku pracował w Instytucie Pamięci Narodowej. Do 2006 roku był naczelnikiem Biura Edukacji Publicznej w krakowskim oddziale IPN, a w latach 2006–2007 dyrektorem tego oddziału.
Działalność opozycyjna i polityczna
Od końca lat 60. był związany z opozycją demokratyczną w PRL. Wielokrotnie zatrzymywany za udział w protestach studenckich. Współpracował ze Studenckim Komitetem Solidarności (od 1977) oraz Komitetem Obrony Robotników. Od 1980 roku był członkiem NSZZ „Solidarność”. Publikował w prasie drugiego obiegu: „Indeksie”, „Solidarności Narodu”, „Robotniku Polskim”, „Przeglądzie Wiadomości Agencyjnych”.
W wyborach parlamentarnych w 1991 roku bez powodzenia kandydował do Sejmu I kadencji z listy Koalicji Republikańskiej, do której należał w latach 1991–1992.
W latach 1992–1997 był członkiem Partii Chrześcijańskich Demokratów, a następnie Stronnictwa Konserwatywno-Ludowego (do 2000 roku).
W wyborach samorządowych w 1998 roku z powodzeniem kandydował do Rady Miasta Krakowa z listy Akcji Wyborczej Solidarność.
W wyborach samorządowych w 2006 kandydował na urząd prezydenta Krakowa z listy Prawa i Sprawiedliwości. W drugiej turze przegrał z Jackiem Majchrowskim, ale po raz drugi uzyskał mandat radnego miejskiego.
W 2007 roku z powodzeniem kandydował do Sejmu VI kadencji z listy PiS.
W 2008 roku wstąpił do PiS. Od 2010 roku jest członkiem Komitetu Politycznego partii, a od 2012 szefem struktur krakowskich.
W wyborach parlamentarnych w 2011 roku uzyskał poselską reelekcję z listy PiS.
W 2014 roku bez powodzenia ubiegał się o mandat eurodeputowanego.
W 2015 roku został po raz trzeci wybrany do Sejmu.
10 listopada 2015 został wybrany na przewodniczącego Klubu Parlamentarnego PiS.
Podczas pierwszego posiedzenia Sejmu VIII kadencji, 12 listopada 2015, został wybrany na wicemarszałka izby.