Android意图语法

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.

Dav*_*ser 8

有关意图解析的基本信息

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

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

系统有两种方法可以解析Intent:

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

如果指定组件(包名和类名),则用于显式查找您指定的活动,并将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分辨率的更多信息,请参阅: