Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。Android中的Intent可以理解为不同组件通信的媒介或者信使。所以Intent的主要作用就是调用起来一个Activity或者Service等。

意图分为显示意图和隐式意图。一般对于显示意图使用是比较方便的,如果我们调用的使我们自己的Activity,则可以直接启动就可以了,如果调用的是其他的Activity,这时候我们就需要获取到我们要启动的Activity的包名和类名,然后调用。

对于自己写的Activity可以按照如下方法调用:

Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);
如果需要调用别人的Activity,我们需要确定包名类名。但是有时候我们不清楚Activity的包名类名,这时候我们需要在设备上或者模拟器上点击一下我们想要调用的Activity,这里以浏览器为例,这时候在logcat中会打印出如下输出:
02-24 23:11:19.652: I/ActivityManager(61): Starting: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.browser/.BrowserActivity } from pid 137

这时候我们需要关注的是cmp=com.android.browser/.BrowserActivity,通过这个我们能够确定包名为com.android.browser,类名为com.android.browser.BrowserActivity,这时候就可以通过如下代码调用起Activity:

Intent intent = new Intent();intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");startActivity(intent);
上面介绍的都是显示意图,但是显示意图也有其缺点,如果我们调用别人的Activity,如果别人的包名类名改了,这时候我们调用就会失败,为了应对这种情况,Android中提供的隐式意图,对于隐式意图我们在调用的时候需要给我们的Intent配置很多参数,然后Android系统会根据这些参数去调用对应的Activity(对于隐式意图的详细解释,还请百度)。如果某个Activity想通过隐式意图的方式被调用,必须在其AndroidManifest.xml中配置对应的参数,我这里有一个配置例子如下:
<activity            android:name="com.mxy.SecondActivity"            android:label="@string/title_activity_second" >            <intent-filter>                <action android:name="com.mxy.intenttest" />                <category android:name="android.intent.category.DEFAULT" />                <category android:name="com.mxy.category" />                <!-- 路径匹配  协议://主机名:端口号/路径 -->                <data                    android:host="www.andyidea.com"                    android:path="/person"                    android:port="8080"                    android:scheme="http" />                <!--                数据类型匹配                 ContentProvider用getType(Uri uri)返回uri代表数据的MIME类型,                如果该数据可能包含多条记录,MIME类型字符串以vnd.android.cursor.dir/开头,                如果该数据只包含一条数据,以vnd.android.cursor.item/开头。                -->                <data android:mimeType="vnd.androd.cursor.item/test" />            </intent-filter>        </activity>
这里配置了一个Activity,并且使其能够通过隐式意图调用,下面是调用的代码:
Intent intent = new Intent();    intent.setAction("com.mxy.intenttest");    /**添加类别:startActivity(intent)启动Activity时会自动添加       * android.intent.category.DEFAULT类别,所以需要在Manifest中       * 配置该类别.但在程序中不需要明确添加该类别     * 只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,     * 才会让该 Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。     * 一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。*/  //    intent.addCategory("android.intent.category.DEFAULT");        /**设置数据:API中说这个方法会将setType的方法设置的类型清除掉*/      intent.setData(Uri.parse("http://www.andyidea.com:8080/person"));            /**设置类型:API中说这个方法会将setData上面的方法设置的数据清除掉*/      intent.setType("vnd.androd.cursor.item/test");            /**同时设置数据和类型:如果Intent过滤器中同时包含数据和数据类型的设置       * 就只能使用该方式来设置数据和类型*/      intent.setDataAndType(Uri.parse("http://www.andyidea.com:8080/person"), "vnd.androd.cursor.item/test");      startActivity(intent);
上面的代码是调用自己写的Activity,其实Android系统也提供了很多的隐式意图供我们调用,下面就是一个例子:
Intent intent = new Intent();    intent.setAction(Intent.ACTION_VIEW);    intent.setData(Uri.parse("http://www.baidu.com"));    startActivity(intent);

介绍完了意图,同时在两个Activity的切换的过程中经常会涉及到传值,对于传值同样也需要使用Intent。如果我们想把一个值传递到待启动的Activity中,需要按照如下格式写:
Intent intent = new Intent(this, SecondActivity.class);    intent.putExtra("name", "mengxiangyue");    startActivity(intent);
然后在启动的Activity中使用如下代码接收传递过来的值:
Intent intent = this.getIntent();String name = "";if(intent.getExtras() != null){name = intent.getExtras().getString("name");Toast.makeText(this, name, Toast.LENGTH_LONG).show();}

传值做到了,有时候我们还希望被启动的Activity关闭的时候,传递某些值给调用它的Activity。这时候我们需要在调用的时候使用如下代码:
Intent intent = new Intent(this, ThirdActivity.class);    intent.putExtra("name", "mengxiangyue");    startActivityForResult(intent, 1);// 1代表请求码
在被启动的Activity执行如下代码:
Intent intent = new Intent(this, SecondActivity.class);intent.putExtra("back", "这是返回的值");setResult(2,intent);finish();
这时候数据传递回来了,需要在Activity中接收,这时候需要实现如下方法:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {System.out.println("requestCode:" + requestCode + " resultCode:" + resultCode + "  data:" + data.getStringExtra("back"));Toast.makeText(this, data.getStringExtra("back"), Toast.LENGTH_LONG).show();super.onActivityResult(requestCode, resultCode, data);}
该方法接收requestCode,resultCode两个参数,这两个参数可以唯一的确定某次请求对应的结果,防止返回的结果发生混乱。

例子工程的下载地址:http://download.csdn.net/detail/mengxiangyue/7242667





更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. Android(安卓)Intent用法总结
  5. Android(安卓)程序在系统中如何完成启动
  6. Activity从屏幕底部滑出、滑入、处理黑色背景和状态栏
  7. Android之AsyncTask的用法
  8. Android之ViewStub的简单使用
  9. ListView的简单应用(一)

随机推荐

  1. 分享偶的android秘籍
  2. Android横竖屏切换总结
  3. Android(安卓)Studio Gradle 添加.so 支
  4. Android:ANT打包常见问题简述
  5. Android程序开发初级教程(一) 开始 Hello
  6. 如何启动Android(安卓)SDK 1.5模拟器
  7. Android软键盘显示模式及打开和关闭方式
  8. Android下玩JNI的新老三种姿势
  9. Android单元测试
  10. 传智播客—Android(二)数据存储和访问 之文