hac*_*cke 3 syntax android android-intent
在我试图找到如何在我的应用程序中启动新意图时,我遇到了几种方法来表达它.
此语法返回运行时错误,即ActivityNotFound异常
Intent in = new Intent("com.something.something");
Run Code Online (Sandbox Code Playgroud)
当然我的android清单包含intent过滤器中的一个动作:
<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>
Run Code Online (Sandbox Code Playgroud)
这种格式有效:
Intent in = new Intent(MainActivity.this, SecondActivity.class);
Run Code Online (Sandbox Code Playgroud)
我也尝试过以下方法:
Intent in = new Intent(this, SomeActivity.class);
Run Code Online (Sandbox Code Playgroud)
这是我正在阅读的一本书中推荐的.这将返回运行时错误,activitynotfound
这个让Eclipse无限地在setClass和setClassName之间来回抛出:
Intent in = new Intent().setClass(this, SecondActivity.class);
Run Code Online (Sandbox Code Playgroud)
我在onclick方法中使用它:
ok.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent in = new Intent(MainActivity.this, SecondActivity.class);
startActivity(in);
}
});
}
Run Code Online (Sandbox Code Playgroud)
这些和为什么只有其中一个为我工作有什么区别?
问候/ M.
有关意图解析的基本信息
意图可以包含以下基本信息:
系统有两种方法可以解析Intent:
如果指定组件(包名和类名),则用于显式查找您指定的活动,并将Intent发送到该活动.不使用其他Intent数据(尽管它被传递给Intent中的被调用活动).这称为"显式意图解析".
如果未指定组件,则ACTION,CATEGORY和DATA字段用于定位一个或多个通告(通过intent-filter)它们可以接受Intent的活动.这称为"隐式意图解析".
针对您的具体问题
当你这样做:
Intent in = new Intent("com.something.something");
Run Code Online (Sandbox Code Playgroud)
您正在创建一个隐式 Intent并将ACTION设置为"com.something.something".如果您随后startActivity()使用此Intent 调用,则会得到,ActivityNotFoundException因为Android无法找到可以接受ACTION ="com.something.something"的Intent的活动.原因是因为您提供了一个使用ACTION ="com.something.something"和CATEGORY ="android.intent.category.LAUNCHER"的intent-filter,但是您没有在Intent中指定CATEGORY(Android会自动添加CATEGORY如果在使用时没有指定任何CATEGORY,则为"DEFAULT" 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);
Run Code Online (Sandbox Code Playgroud)
您正在创建一个指定组件的显式 Intent SecondActivity.此方法的签名是Intent(Context packageContext, Class clas).它使用包名称from packageContext和类名clas来为该组件创建显式Intent.如果在Activity中使用此构造函数,则可以将其this用作第一个参数,因为是Activityextends Context.如果您从另一个类(如an OnClickListener)使用此构造函数,则需要指定MyActivity.this作为第一个传递Activity实例而不是OnClickListener的参数(因为OnClickListener不会扩展Context).
当你这样做:
Intent in = new Intent().setClass(this, SecondActivity.class);
Run Code Online (Sandbox Code Playgroud)
您正在创建如上所述的显式 Intent.这与使用完全相同:
Intent in = new Intent(this, SecondActivity.class);
Run Code Online (Sandbox Code Playgroud)
你不能在一个内部执行此操作,OnClickListener因为第一个参数需要是一个Context(或扩展的类Context,如Activity).
如果你想创建一个显式的 Intent,你也可以使用它:
Intent in = new Intent().setClassName("com.something", "com.something.SecondActivity");
Run Code Online (Sandbox Code Playgroud)
这会创建一个明确的意图,但您不需要这样做Context.您可以将包名称和类名称作为字符串传递(如果您了解它们).
有关Intent分辨率的更多信息,请参阅:
| 归档时间: |
|
| 查看次数: |
18884 次 |
| 最近记录: |