Intent,中文意思为意图,就是说你想要干什么,然后把这个意思传递给其它组件,这个组件帮你完成你的意图。Intent作为一个消息对象被传递给Android组件,作为组件之间沟通的桥梁。
Intent有三个方面的用途:
- 启动Activity
- 启动Service
- 传递broadcast
Intent的类型
- Explicit intents 通过显示式的class name启动
- Implicit intents 通过要完成的Action启动,系统会根据manifest中每个组件注册的intent filters来决定启动哪一个组件完成这个Action任务
Intent主要包含下面的信息,用来定位要启动的组件
- Component name, 要启动的组件名,当指定时,这个Intent就是Explicit Intent, 如果不指定Component name,系统会根据其它的Intent信息启动合适的组件,当要启动的组件为Service的时候,必须指定Component name,使用setClassName()
- Action, 用来描述要执行行为的字符串,使用setAction(), 可以自定义自己的Action, 需要加包名
- Data,根据Action的不同,需要携带不同的data数据,它是一个URI对象,使用setData(),setType(),setDataAndType()
- Category,用来指定哪种类型的组件应该handle这个Intent
- Extras, Key-Value键值对数据,为完成这个Action时提供额外的数据,使用putExtras()
- Flags,当这个Component启动后,系统该如何处理这个Component,例如,是否把这个组件(Activity)加入到最近运行列表中,启动这个Activity时,是否把它放到task中或back task中等等。
Explicit Intent 示例
public class Activity2 extends Activity {
/*
* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2_main);
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/*
* (non-Javadoc)
* @see android.app.Activity#onStart()
*/
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// 启动Activity2
// intent.addCategory(Intent.CATEGORY_APP_BROWSER);
Intent intent = new Intent();
intent.setClassName(this, "com.example.intentsample.Activity2");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
}
需要在manifest文件中声明Activity2
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.intentsample.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.intentsample.Activity2" >
</activity>
</application>
Implicit Intent 示例
下面代码来启动浏览器
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_APP_BROWSER);
intent.setAction(Intent.ACTION_MAIN);
startActivity(intent);
如果,要搜索关键字“Intent是什么东西?”,可以使用下面的代码
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "Intent是什么东西?");
startActivity(intent);
每个Intent的Action,Category是什么意思,可以查阅http://developer.android.com/reference/android/content/Intent.html ,很详细的说明,多看官方文档,好处多多,一有问题就百度来Google去,真不如认真细心地看下官方API
另外,如果没有可执行此Action的App或Activity,那么你的程序可能会崩溃,所以需要在startActivity()调用的时候判断一下,代码如下
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "Intent是什么东西?");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}