51

我希望使用自定义操作在我的应用程序中启动一项活动。我找到了一些答案,但我尝试的所有内容都显示java.lang.RuntimeException没有找到处理 Intent { act=com.example.foo.bar.YOUR_ACTION } 的活动。

这是我的清单文件中的活动:

<activity
    android:name=".FeedbackActivity" >  
    <intent-filter>
        <action android:name="com.example.foo.bar.YOUR_ACTION" />
    </intent-filter>
</activity>

这就是我开始活动的方式:

Intent intent = new Intent("com.example.foo.bar.YOUR_ACTION");
startActivity(intent);

任何帮助将不胜感激。

4

4 回答 4

136

我认为您需要为您的意图过滤器添加一个默认类别,例如。

<activity
    android:name=".FeedbackActivity" >  
    <intent-filter>
        <action android:name="com.example.foo.bar.YOUR_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

有关更多信息,请参阅此答案

于 2012-06-13T05:48:32.910 回答
39

我认为你创造你的意图是错误的。试试这样:

String CUSTOM_ACTION = "com.example.foo.bar.YOUR_ACTION";

//Intent i = new Intent(this, FeedBackActivity.class);  // <--- You might need to do it this way.
Intent i = new Intent();
i.setAction(CUSTOM_ACTION);

startActivity(i);
于 2012-06-06T21:08:56.477 回答
4

只需将意图过滤器类别添加为默认值。

隐式意图完美地工作,在许多情况下,使用带有 Intent-action 的隐式意图来调用服务/活动比使用类名更好。

startActivty() / startService()使用适当的上下文之前,您可以'queryIntentActivities(Intent intent, int flags)'从包管理器类中使用此方法。

它帮助 ActivityManager(负责启动活动)检查 Android 系统是否与您的 Intent 匹配。

如果不是,则返回列表大小 0 或 >0

通过这种方式,您还可以检查您的应用程序是否正在接收呼叫,在这种情况下,即使您的应用程序没有安装/出现问题,它也不会崩溃,但会在 Log 中抛出警告。用户除了应用不启动外,不会遇到大麻烦。

(如果旅游应用程序崩溃,用户永远不会原谅你)。

希望这会有所帮助!快乐编码。:)

于 2014-04-12T08:33:19.057 回答
2

当尝试启动驻留在动态功能模块中的活动并通过操作字符串启动时,我遇到了同样的问题,因为活动在编译时无法通过名称解析。所以我设置了动作,但活动每次都崩溃(没有找到处理意图 bla bla.. 的活动),直到我设置了正确的包名称。

Context c = getApplicationContext();// flag would be require Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag
Intent i = new Intent(action_string);
i.setPackage(context.getPackageName());//this did the trick actually
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

在清单中:将 catrgory 默认添加到来自谷歌文档的意图过滤器

<category android:name="android.intent.category.DEFAULT"/>

注意:为了接收隐式意图,您必须在意图过滤器中包含 CATEGORY_DEFAULT 类别。方法 startActivity() 和 startActivityForResult() 将所有意图视为声明了 CATEGORY_DEFAULT 类别。如果您没有在您的意图过滤器中声明它,则没有隐式意图将解析为您的活动。

于 2020-07-21T07:58:24.293 回答