Intent解析的基本信息
Intent可以包含以下基本信息:
系统有两种方式解析 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