使用自定义操作启动Activity

54

我想使用自定义操作在我的应用程序中启动一个活动。我已经找到了一些答案,但尝试所有的方法都会抛出 java.lang.RuntimeException,并显示No Activity found to handle 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);
任何帮助都将不胜感激。

我认为你应该将 Maks 的回答标记为正确的(为了参考其他用户)。 - Kzar
实际上,将一个答案标记为被接受的意思是它对于提问者有效,而不一定是对于其他人来说最好的答案 - 这就是点赞的作用。 - Cullub
4个回答

143

我认为你需要在你的intent-filter中添加一个默认类别,例如:

<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>

查看这个答案获取更多信息。


10
这是正确答案,应该标记为正确。 - David
是的!谢谢伙计 :) - yahya

39

我认为您创建intent的方法不正确。请尝试按照以下方式:

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);

我不再收到异常了,但它只显示一个屏幕供用户选择应用程序来完成操作。 - Jason Crosby
15
他做得“很好”。他只是缺少默认类别。 - TWiStErRob
3
调用setAction()方法与调用new Intent(String)构造函数是相同的。 - David

4
只需将Intent-Filter类别添加为默认类别即可。 隐式意图运作完美,在许多情况下,使用带有Intent-action的隐式意图调用服务/Activity比使用类名更好。 在使用适当的上下文之前,您可以使用来自PackageManager类的方法“queryIntentActivities(Intent intent, flags)”。 它有助于ActivityManager(负责启动活动)检查Android系统是否与您的Intent匹配。 如果不是,则返回一个列表大小0或者>0。 通过这种方式,您也可以检查您的应用程序是否被调用,即使您的应用程序未安装/存在问题,它也不会崩溃,而是在日志中抛出一个警告。用户除了应用程序未启动外不会遇到任何大问题。(如果您的应用程序崩溃了,用户永远不会原谅您)。 希望这会有所帮助! 愉快的编码。:)

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);

在清单文件中:将类别“default”添加到意图过滤器中。来自谷歌文档。
<category android:name="android.intent.category.DEFAULT"/>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接