2011-07-15 18 views
13

Szukam sposobu na uruchomienie domyślnego programu uruchamiającego Androida programowo, coś podobnego do kodu poniżej. Czy muszę dodać coś do pliku manifestu? Dzięki!Uruchamianie domyślnego programu uruchamiającego Androida programowo

Intent intent = new Intent(); 
intent.setClassName("com.android.launcher", "Launcher"); 
startActivity(intent); 
+0

http://stackoverflow.com/questions/5547606/how-to-integrate-default-app-of-android-in-our-app-programatically –

Odpowiedz

19

Czy próbowałeś tego?

startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)); 

(nie próbowałem to sam, bo mój przypadek użycia jest trochę bardziej skomplikowana --- Mam zastąpił wyrzutnię i chcę zadzwonić do starą wyrzutnię ...)

Odkryłem również, że możesz użyć menedżera pakietów, aby przejrzeć wszystkie działania, które spełniają pewne kryteria filtrowania zamiarów. Na przykład, jeśli chcesz znaleźć wszystkie działania oznaczone jako domyślny domu działalności głównej, użyj tego:

Intent intent=null; 
final PackageManager packageManager=getPackageManager(); 
for(final ResolveInfo resolveInfo:packageManager.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY)) 
{ 
    if(!getPackageName().equals(resolveInfo.activityInfo.packageName)) //if this activity is not in our activity (in other words, it's another default home screen) 
    { 
     intent=packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName)); 
     break; 
    } 
} 

pamiętać, że zastąpiły domyślnego ekranu głównego w urządzeniu --- dlatego muszę zrobić pewność, że aktywność, którą znalazłem, nie jest aktywnością, która działa! Jeśli nie zastąpiłeś domyślnej aktywności domowej, nie musisz tego sprawdzać --- po prostu użyj pierwszej (i prawdopodobnie jedynej) domyślnej aktywności domowej.

(Zauważ, że nadal nie mogę uruchomić starego launchera z mojego launchera, być może dlatego, że stary program uruchamiający prowadzi rejestr domyślnego launchera, który jest moim nowym launcherem, i po prostu oddzwania do niego. Ale przynajmniej się nie zawiesi i domyślam się, że gdyby nie zastąpić starego ekranu głównego, to po prostu by działało.)

+4

Należy pamiętać, że metoda getLaunchIntentForPackage nie zwróci intencji programu uruchamiającego od sprawdza tylko kategorie INFO i LAUNCH, podczas gdy Laucher ma kategorię DOM w zamierzeniu. Oznacza to, że wywołanie w atrybucie if wewnątrz zwraca wartość zerową. Zastąpienie inicjalizacji zamiany kodem poniżej zrobiło dla mnie trik. Intencją = nowy zamiar() addCategory (Intent.CATEGORY_HOME) .setAction (Intent.ACTION_MAIN) \t \t \t \t \t \t .setClassName (resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name.); – r1k0

+0

hej @GarretWilson, czy wiesz, jak uruchomić domyślny program uruchamiający? – isaganiesteron

+0

@isaganiesteron, przepraszam, nie tknąłem tego kodu od lat. W tej chwili nie mam żadnych aktualizacji. –

2

Po odpowiedzi Garreta Wilsona, oto brzydki, jednolinijkowy, zakładając context to kontekst aplikacji:

context.startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setPackage(context.getPackageManager().queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY).get(0).activityInfo.packageName)); 

Kod ten zakłada, że ​​oryginalny aktywność domu system jest zawsze pierwszy wynik retur ned przez queryIntentActivities, podczas gdy zaakceptowana odpowiedź zwraca pierwszą aktywność domową nienależącą do działającego pakietu.

Nadal nie jest jasne, jak uzyskać czysto systemową aktywność domową. Niektóre wątki wspominają o tym, że można użyć do tego celu getPackageManager().resolveActivity(intent, flags), ale wydaje się, że z tą metodą nie można użyć PackageManager.MATCH_SYSTEM_ONLY.

Powiązane problemy