Android的意图语法(Android intent syntax)

2019-07-31 05:00发布

在我试图找出如何开始在我的应用程序一个新的意图,我遇到措辞它的几种方法。

此语法返回一个运行时错误,即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

Answer 1:

关于意图的分辨率基本信息

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

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

有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


文章来源: Android intent syntax