Intent是用来启动Android重要组件的工具,比如:Activity Service BroadcastReceiver
Intent对象大致包括:Component Action Category Data Type Extra Flag 这七个
首先是一个Component,我们想要说明一下component的作用:
我们知道Intent的启动方式有两种,
- 直接启动:指定了component属性的Intent。明确说明了它将要启动哪个组件,此时Intent中包含了足够的信息。
- 隐式启动:没有指定component属性,Intent没有明确指定要去启动哪个组件,所以会根据Intent指定的规则去启动符合条件的组件,具体是哪个组件不确定。
这里写一个例子来解释一下如何设置component属性
public class MainActivity extends AppCompatActivity {
private Button bt1;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
bt1 = (Button) findViewById(R.id.button_first1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
ComponentName comp = new ComponentName(MainActivity.this, second.class)
Intent intent= new Intent();
intent.setComponent(comp);
startActivity(intent);
}
});
}
上面的代码:
创建一个ComponentName对象,接着把这个对象设置成Intent的属性。这样在点击这个按钮的时候回按照Intent的意图去启动指定的组件。
这些代码可以简化:
Intent intent= new Intent(MainActivity.this, second.class);
startActivity(intent);
Intent的构造器当中实际上已经提供了一个指定组件的方法。
Action、 Category属性
这两个属性都是一个普通的字符串,其中Action代表Intent要完成的一个抽象动作,这个抽象动作的结果,会产生什么,这个Action本身并不管。这七绝与Activity中的
public class MainActivity extends AppCompatActivity {
private Button bt1;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
bt1 = (Button) findViewById(R.id.button_first1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
Intent intent= new Intent();
intent.setAction(MainActivity.CRAZYIT_ACTION);
startActivity(intent);
}
});
}
如果单单只是看上面的代码完全看不出来要启动哪个Activity,这取决于Activity配置中
<action android:name="...action.CRAZYIT_ACTION"/T>
需要说明:一个Intent对象只能有一个Action属性。Intent的setAction方法可以设置属性值。
而Category属性可以用addCategory方法来添加。当程序创建Intent时会自动调用CATEGORY_DEFAULT常量。