2010-05-20 96 views
22

有沒有一種方法來檢查,看看你的設備上存在一個活動?如果我有YouTube視頻鏈接,我想在YouTube PlayerActivity中將其指定爲打開。但是,如果由於某種原因,我不想崩潰。確定當前設備上是否存在活動?

有沒有一種方法來檢查,看看是否存在活動?我不認爲我可以捕獲運行時異常,因爲startActivity()不會拋出它。

回答

6

我不認爲我能趕上運行 例外

其實,這個工程:

try { 
    startActivity(new Intent(..)); 
} catch (ActivityNotFoundException e) { 
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show(); 
} 
+6

這當然是有效的,但是這樣做通常被認爲是不好的做法。 Samuh(http://stackoverflow.com/a/2879403/15695)的答案是這樣做的正確方法。 – BoD 2012-09-12 15:51:27

+0

這不僅是不好的做法,但如果您需要使用startActivityForResult,那麼在我測試的設備上會出現一些嚴重的效率/凍結問題。 – 2015-10-21 21:31:00

69

您可以創建一個必要的組成部分信息的意圖對象,然後檢查是否意圖是可調用或not.I偶然發現了這個片段在這裏SO,沒有鏈接到實際的線程。

private boolean isCallable(Intent intent) { 
     List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
} 
+1

這是*正確*答案:) – hrules6872 2015-02-19 14:55:47

+0

你用這個怎麼樣? – 2017-11-16 14:06:03

7

我落得這樣做:

 Intent intent = new Intent(); 
     intent.setClassName("com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity"); 

     if(getContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) { 
      getContext().startActivity(intent); 
     } else { 
      getContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT)); 
     } 

Th可以確保特定於Google的添加帳戶意圖存在,如果不存在,則回退到通用的更一般的ACTION_ADD_ACCOUNTS。

14

這是爲了做到這一點最簡單的方法:也

boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null; 

的一個recommended by Google

首先驗證一個應用程序存在接收的意圖,在你的意圖調用resolveActivity()目的。如果結果是非空,至少有一個應用程序,可以處理這個意圖,它是安全地調用startActivity()。如果結果爲空,則不應使用意圖,如果可能,應禁用調用該意圖的功能。

+1

對不存在的活動返回true。恐怕這不是最好的解決方案。我使用了另一個答案中發佈的isCallable方法,它按預期工作。 – tomrozb 2014-06-11 06:07:30

+0

@toro什麼了'intent.resolveActivity(getPackageManager())'返回呢?如果這個方法真的返回一個不存在的活動,這肯定看起來像一個錯誤。此外,根據谷歌文檔,'名單列表= getPackageManager()queryIntentActivities(意向,PackageManager.MATCH_DEFAULT_ONLY);'不完全一樣,只是它不只是最優先返還活動。 – Malcolm 2014-06-11 15:12:47

+1

我的意圖是這樣創建的:'intent.setComponent(new ComponentName(「package」,「package.activity-name));'它返回的是什麼 - 'ComponentInfo {」package「/」package.activity-名}'。但事實上這個活動並不存在,因此調用這個意圖最終會導致運行時崩潰。 – tomrozb 2014-06-12 10:02:57

0

這裏是我如何檢查一個Activity是在設備上可用:

 Intent intent = new Intent(Intent.ACTION_CALL); 
     intent.setData(Uri.parse("tell//:" + phoneNumber)); 

     PackageManager manager = context.getPackageManager(); 
     List<ResolveInfo> activities = manager.queryIntentActivities(
       intent, 0); 
     if (!manager.hasSystemFeature(
       PackageManager.FEATURE_TELEPHONY) || activities == null || activities 
       .size() < 1) { 
      Toast.makeText(
        context, 
        "Sorry, there were no apps that worked with that request.", 
        Toast.LENGTH_SHORT).show(); 
     } else { 
      context.startActivity(intent); 
     }