在我试图找出如何开始在我的应用程序一个新的意图,我遇到措辞它的几种方法。
此语法返回一个运行时错误,即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);
}
});
}
什么是它们之间的区别,为什么只有他们为我工作的一个?
商祺/ M
关于意图的分辨率基本信息
意图可以包含以下基本信息:
有2种方式是意图由系统解析:
- 明确的(如果指定它使用部分)
- 隐式(使用ACTION,类别和数据,以寻找合适的活动)
如果指定那么这是用来明确地找到您所指定的活动,其目的是发送到活动的组件(包名和类名)。 其它意图数据不使用(尽管它被传递给被叫活性在Intent)。 这就是所谓的“明确意图的决议”。
如果不指定组件,那么行动,类别和数据字段用于定位广告(通过意图过滤器),他们可以接受意图的一个或多个活动。 这就是所谓的“隐性意图的决议”。
为了您的具体问题
当你这样做:
Intent in = new Intent("com.something.something");
你正在创建一个隐含的意图和设置操作“com.something.something”。 如果您然后调用startActivity()
与此意图,你ActivityNotFoundException
由于Android无法找到可以接受动作的通知的活动=“com.something.something”。 究其原因是因为你提供了一个意图过滤器与ACTION =“com.something.something”和类别=“android.intent.category.LAUNCHER”但是你有没有指定的类别在你的意图(Android的自动添加的类别“DEFAULT”到一个Intent如果没有使用时指定任何类别startActivity()
为了使这项工作就应该把
- 更换
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);
你正在创建一个明确的意图指定组件SecondActivity
。 此方法的签名是Intent(Context packageContext, Class clas)
它使用从包名称packageContext
和类名从clas
创建该组件的明确意图。 如果你使用这种构造的活动中,你可以使用this
作为第一个参数,因为Activity
扩展Context
。 如果您使用此构造函数从另一个类(像一个OnClickListener
),你需要指定MyActivity.this
作为第一个参数传递活动的实例,而不是OnClickListener的(因为OnClickListener
不会扩展Context
)。
当你这样做:
Intent in = new Intent().setClass(this, SecondActivity.class);
要创建一个明确的意图如上。 这是完全一样的使用:
Intent in = new Intent(this, SecondActivity.class);
你不能做到这一点内部OnClickListener
,因为第一个参数必须是一个Context
(或扩展一个类Context
,像Activity
)。
如果你想创建一个明确的意图,你也可以使用这个:
Intent in = new Intent().setClassName("com.something", "com.something.SecondActivity");
这将创建一个明确的意图,但你并不需要一个Context
这一点。 您只需通过包名和类名作为字符串(如果您知道)。
有关意向分辨率的详细信息,请参阅:
- 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