3

在我试图找出如何在我的应用程序中启动新意图的过程中,我遇到了几种措辞方式。

此语法返回运行时错误,即 ActivityNotFound 异常

Intent in = new Intent("com.something.something"); 

当然,我的 android manifest 在意图过滤器中包含一个动作:

<activity
        android:name=".SecondActivity"
        android:label="@string/title_activity_second" >
        <intent-filter>
            <action android:name="com.something.something" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> 

这种格式有效:

Intent in = new Intent(MainActivity.this, SecondActivity.class); 

我还尝试了以下方法:

Intent in = new Intent(this, SomeActivity.class); 

这是我正在阅读的一本书中推荐的。这会返回一个运行时错误,activitynotfound

这让 Eclipse 让我在 setClass 和 setClassName 之间来回切换:

 Intent in = new Intent().setClass(this, SecondActivity.class);

我在 onclick 方法中使用它:

ok.setOnClickListener(new View.OnClickListener()
    {

        @Override
        public void onClick(View v)
        {

            Intent in = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(in);
        }
    });
}

这些有什么区别,为什么只有其中一个为我工作?

问候/米

4

2 回答 2

11

Intent解析基本信息

意图可以包含以下基本信息:

  • 行动
  • 类别
  • 数据
  • 零件

系统解析 Intent 有两种方式:

  • 显式(如果指定,则使用 COMPONENT)
  • 隐式(使用 ACTION、CATEGORY 和 DATA 来寻找合适的活动)

如果您指定组件(包名和类名),那么这将用于显式查找您指定的活动并将 Intent 发送到该活动。不使用其他 Intent 数据(尽管它被传递给 Intent 中的被调用活动)。这称为“显式意图解析”

如果您不指定组件,则 ACTION、CATEGORY 和 DATA 字段用于定位一个或多个广告(通过意图过滤器)他们可以接受 Intent 的活动。这称为“隐式意图解析”


针对您的具体问题

当你这样做时:

Intent in = new Intent("com.something.something");

您正在创建一个隐式Intent 并将 ACTION 设置为“com.something.something”。如果你然后startActivity()用这个 Intent 调用,你会得到,ActivityNotFoundException因为 Android 找不到可以接受 ACTION="com.something.something" 的 Intent 的 Activity。原因是您提供了一个带有 ACTION="com.something.something" 和 CATEGORY="android.intent.category.LAUNCHER" 的意图过滤器,但您没有在 Intent 中指定 CATEGORY(Android 会自动添加 CATEGORY如果在使用startActivity()) 时未指定任何 CATEGORY,则为 Intent 设置“DEFAULT”。要完成这项工作,您应该

  • 替换CATEGORY="android.intent.category.LAUNCHER"CATEGORY="android.intent.category.DEFAULT"
  • 添加<category android:name="android.intent.category.DEFAULT" />

到意图过滤器SecondActivity


当你这样做时:

Intent in = new Intent(MainActivity.this, SecondActivity.class);

您正在创建一个明确的Intent 指定组件SecondActivity。此方法的签名是Intent(Context packageContext, Class clas). 它使用包名 frompackageContext和类名 fromclas为该组件创建显式 Intent。如果您在 Activity 中使用此构造函数,则可以仅将this其用作第一个参数,因为Activityextends Context。如果您从另一个类(如OnClickListener)使用此构造函数,则需要指定MyActivity.this作为第一个参数以传递 Activity 的实例而不是 OnClickListener 的实例(因为OnClickListener不扩展Context)。


当你这样做时:

Intent in = new Intent().setClass(this, SecondActivity.class);

您正在创建一个明确的Intent 如上所述。这与使用完全相同:

Intent in = new Intent(this, SecondActivity.class);

您不能在 an 内部执行此操作,OnClickListener因为第一个参数需要是 a Context(或扩展的类Context,如Activity)。

如果你想创建一个明确的Intent 你也可以使用这个:

Intent in = new Intent().setClassName("com.something", "com.something.SecondActivity");

这会创建一个明确的意图,但您不需要这样做Context。您可以将包名和类名作为字符串传递(如果您知道的话)。

有关 Intent 解析的更多信息,请参阅:

于 2012-08-27T10:26:42.730 回答
0

请注意,当您在“Intent in = new Intent(this, SomeActivity.class);”中使用“this”关键字时,请确保您不在 MainActivity 的子类中,这可能会将错误的 Activity 设置为显式意图的一部分零件。强文本

于 2020-12-23T00:06:47.910 回答