0

外國申請我試圖讓下面的代碼來執行:Android的推出從我自己的

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_HOME); 
intent.setComponent(new ComponentName(" **Home package** "," **Home class** ")); 
        startActivity(intent); 

基本上我正在尋找一種方法特異性靶向並加載準確的,原始的,家庭應用。

回答

0

編輯:SOLUTION:

 PackageManager pm=getPackageManager(); 
     Intent main=new Intent(Intent.ACTION_MAIN, null); 

     main.addCategory(Intent.CATEGORY_HOME); 
     List<ResolveInfo> launchables=pm.queryIntentActivities(main, 0); 

     Collections.sort(launchables, 
         new ResolveInfo.DisplayNameComparator(pm)); 

     int launcher_flag = findLauncherApp(launchables); 

     ResolveInfo launchable = launchables.get(launcher_flag); 

     ActivityInfo activity=launchable.activityInfo; 
     ComponentName name=new ComponentName(activity.applicationInfo.packageName, 
              activity.name); 
     Intent i=new Intent(Intent.ACTION_MAIN); 

     i.addCategory(Intent.CATEGORY_LAUNCHER); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
        Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
     i.setComponent(name); 

     startActivity(i); 

凡findLaucherApp()把列表轉換成字符串數組,並詢問每一個,看它是否包含「com.android.launcher2」,然後返回其ID。

1

從技術上講,你無法總是知道「確切的,原始的,家庭應用程序」。

您可以使用PackageManagerqueryIntentActivities()找到找到誰所有響應MAIN/HOMEIntents。如果有兩個答案,而你的答案是一個(我猜測你的情況),那麼另一個答案就是「確切的,原始的,家庭應用程序」。您可以通過轉到與已解決的活動關聯的ApplicationInfo對象並檢查FLAG_SYSTEM以查看它是否安裝在系統映像中來進一步驗證此情況。這種方法可能不是完全防彈的,但它可能足夠滿足您的需求。

另一個選擇是讓你簡單地記錄當前的默認MAIN/HOME活動時,您是第一次運行。在用戶選擇將您設爲默認設置之前,您的應用程序將運行的可能性很大。再次,這有一些漏洞(例如,它們使您在第一次運行之前成爲默認設置)。

+0

聽起來就像是足夠接近。 queryIntentActivites()返回「列表」我怎樣才能將該回饋到「startActivity(xxx)」類型的行中? Cheers – Edd

+0

@Edd:最簡單的解釋方法是指出這個示例項目,它使用'queryIntentActivities()'創建啓動器樣式的ListView:https://github.com/commonsguy/cw-advandroid /樹/主/反思/ Launchalot – CommonsWare

相關問題