使用自定义操作启动活动

时间:2012-06-06 20:09:57

标签: android android-intent android-activity

我希望使用自定义操作在我的应用中启动活动。我找到了一些答案,但我尝试的所有内容都会引发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 个答案:

答案 0 :(得分:107)

我认为你需要的是为你的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>

请参阅this answer了解详情。

答案 1 :(得分:25)

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

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

答案 2 :(得分:1)

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

隐式意图非常有效,在许多情况下,使用Intent-action隐式意图来调用服务/ Activity比使用类名更好。

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

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

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

通过此,您还可以检查您的应用是否正在接听电话,在这种情况下,即使您的应用未安装/遇到问题,它也不会崩溃但会在日志中发出警告。除了app没有启动,用户将面临大麻烦。

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

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

答案 3 :(得分:0)

当尝试启动驻留在动态功能模块中的活动并从操作字符串开始时,我遇到了相同的问题,因为在编译时无法按名称解析该活动。 因此,我设置了动作,但是每次设置正确的包名称之前,活动每次都会崩溃(找不到任何活动来处理意图。)。

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.setPackageName(context.getPackageName());//this did the trick actually
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);

在清单中:将类别默认值添加到意图过滤器 来自Google文档

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

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