有沒有一種方法來檢查,看看你的設備上存在一個活動?如果我有YouTube視頻鏈接,我想在YouTube PlayerActivity中將其指定爲打開。但是,如果由於某種原因,我不想崩潰。確定當前設備上是否存在活動?
有沒有一種方法來檢查,看看是否存在活動?我不認爲我可以捕獲運行時異常,因爲startActivity()不會拋出它。
有沒有一種方法來檢查,看看你的設備上存在一個活動?如果我有YouTube視頻鏈接,我想在YouTube PlayerActivity中將其指定爲打開。但是,如果由於某種原因,我不想崩潰。確定當前設備上是否存在活動?
有沒有一種方法來檢查,看看是否存在活動?我不認爲我可以捕獲運行時異常,因爲startActivity()不會拋出它。
我不認爲我能趕上運行 例外
其實,這個工程:
try {
startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
您可以創建一個必要的組成部分信息的意圖對象,然後檢查是否意圖是可調用或not.I偶然發現了這個片段在這裏SO,沒有鏈接到實際的線程。
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
這是*正確*答案:) – hrules6872 2015-02-19 14:55:47
你用這個怎麼樣? – 2017-11-16 14:06:03
我落得這樣做:
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。
這是爲了做到這一點最簡單的方法:也
boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;
首先驗證一個應用程序存在接收的意圖,在你的意圖調用
resolveActivity()
目的。如果結果是非空,至少有一個應用程序,可以處理這個意圖,它是安全地調用startActivity()
。如果結果爲空,則不應使用意圖,如果可能,應禁用調用該意圖的功能。
對不存在的活動返回true。恐怕這不是最好的解決方案。我使用了另一個答案中發佈的isCallable方法,它按預期工作。 – tomrozb 2014-06-11 06:07:30
@toro什麼了'intent.resolveActivity(getPackageManager())'返回呢?如果這個方法真的返回一個不存在的活動,這肯定看起來像一個錯誤。此外,根據谷歌文檔,'名單
我的意圖是這樣創建的:'intent.setComponent(new ComponentName(「package」,「package.activity-name));'它返回的是什麼 - 'ComponentInfo {」package「/」package.activity-名}'。但事實上這個活動並不存在,因此調用這個意圖最終會導致運行時崩潰。 – tomrozb 2014-06-12 10:02:57
這裏是我如何檢查一個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);
}
這當然是有效的,但是這樣做通常被認爲是不好的做法。 Samuh(http://stackoverflow.com/a/2879403/15695)的答案是這樣做的正確方法。 – BoD 2012-09-12 15:51:27
這不僅是不好的做法,但如果您需要使用startActivityForResult,那麼在我測試的設備上會出現一些嚴重的效率/凍結問題。 – 2015-10-21 21:31:00