为什么没有找到处理 Intent 的 Activity?

Tam*_*ári 7 android android-intent android-package-managers

getPackageManager().getLaunchIntentForPackage("com.example.app")我想自己创建启动意图,而不是常规方式。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage("com.example.app");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

如果 Activitycom.example.app已安装、启用且具有正确的清单,为什么 Android 找不到 Activity ?(它与getLaunchIntentForPackage.完美配合。)

use*_*104 5

据我所知,您正在尝试启动具有已知包名称 ( com.example.app) 的已知应用程序的启动器活动。我假设您有有关该应用程序的信息。因此,您可以通过明确的意图来启动它,如下所示:

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.app", "com.example.app.MainActivity"));
if(intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

编辑:对两个意图对象进行分析(intent1==您自己的意图VS intent2==创建的意图getLaunchIntentForPackage()),区别在于

意图1:

{ act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.example.app }

意图2:

{ act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.example.app cmp=com.example.app/.MainActivity }

我必须相信,您为创建自己的意图对象所做的工作不足以使明确的意图发挥作用。您必须向 Android 提供有关您意图的更多信息,例如具体的组件名称(如我上面的回答所示)。

  • `setComponent` 有效。这很清楚,我同意你的观点。(`setClassName` 也有效。)但是我的目标不是找到工作方法,而是首先找出为什么我的问题中的代码示例不起作用。为什么需要组件名称?包名称应该足够了,因为它使意图明确。**[我对此有一个答案](/sf/ask/3814489591/#54552362)**,但更多细节是需要。 (2认同)

小智 1

“要接收隐式意图,您必须在意图过滤器中包含 CATEGORY_DEFAULT 类别。” - 你的接收应用程序有这个吗?

例子:

<activity android:name="ShareActivity">
     <intent-filter>
         <action android:name="android.intent.action.SEND"/>
         <category android:name="android.intent.category.DEFAULT"/>
         <data android:mimeType="text/plain"/>
     </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

摘自:https: //developer.android.com/guide/components/intents-filters#Receiving

您还可以检查以确保有一个活动可以接收您的广播:

 PackageManager packageManager = getPackageManager();
 List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
 boolean isIntentSafe = activities.size() > 0;
Run Code Online (Sandbox Code Playgroud)

摘自:https: //developer.android.com/training/basics/intents/sending#java