Android意图语法

2023-12-05

在我尝试找出如何在应用程序中启动新意图的过程中,我遇到了几种表达它的方法。

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

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

当然,我的 Android 清单在意图过滤器中包含一个操作:

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

它们之间有什么区别?为什么只有其中之一对我有用?

问候 /米


Intent解析的基本信息

Intent可以包含以下基本信息:

  • ACTION
  • CATEGORY
  • DATA
  • 成分

系统有两种方式解析 Intent:

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

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

如果您没有指定组件,则 ACTION、CATEGORY 和 DATA 字段将用于定位一个或多个活动(通过意图过滤器)通告它们可以接受 Intent。这就是所谓的“隐式意图解析”.


针对您的具体问题

当你这样做时:

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

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

  • Replace CATEGORY="android.intent.category.LAUNCHER" with CATEGORY="android.intent.category.DEFAULT" or
  • Add <category android:name="android.intent.category.DEFAULT" />

到意图过滤器SecondActivity


当你这样做时:

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

您正在创建一个explicit指定组件的意图SecondActivity。该方法的签名是Intent(Context packageContext, Class clas)。它使用的包名称来自packageContext和类名来自clas为该组件创建显式 Intent。如果您在 Activity 中使用此构造函数,则只需使用this作为第一个参数,因为Activity延伸Context。如果您使用另一个类中的此构造函数(例如OnClickListener)你需要指定MyActivity.this作为传递 Activity 实例而不是 OnClickListener 实例的第一个参数(因为OnClickListener不延长Context).


当你这样做时:

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

你正在创建一个explicit意图如上。这与使用完全相同:

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

你不能在一个OnClickListener因为第一个参数必须是Context(或扩展的类Context, like Activity).

如果你想创建一个explicit意图你也可以使用这个:

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

这创建了一个explicit意图,但你不需要Context为了这。您可以将包名称和类名称作为字符串传递(如果您知道它们)。

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

  • http://developer.android.com/guide/components/intents-filters.html
  • http://developer.android.com/reference/android/content/Intent.html
  • http://developer.android.com/reference/android/content/IntentFilter.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android意图语法 的相关文章