Intent是什么东西?

来源:互联网 发布:怎样看融资融券数据 编辑:程序博客网 时间:2024/04/28 21:26

Intent,中文意思为意图,就是说你想要干什么,然后把这个意思传递给其它组件,这个组件帮你完成你的意图。Intent作为一个消息对象被传递给Android组件,作为组件之间沟通的桥梁。

Intent有三个方面的用途:

  1. 启动Activity
  2. 启动Service
  3. 传递broadcast
Intent的类型
  1. Explicit intents  通过显示式的class name启动
  2. Implicit intents 通过要完成的Action启动,系统会根据manifest中每个组件注册的intent filters来决定启动哪一个组件完成这个Action任务
创建Intent
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); }







0 0
原创粉丝点击