Android的Intent

       Intent是用于组件之间的交互操作,比如Activity调用另外一个Activity,并且从另外一个Activity获取执行结果等等互动操作,就要通过收发Intent实现。intent这个单词的意思是“意图”,那也就是发送互动的意图,双方都要有相关的意图才能良好的交互。

具体的使用:

1、调用另一个组件:

比如从一个Activity跳转到(启动)另外一个Activity。

//首先生成并设置Intent:
Intent intent=new Intent();
intent.setClass( this,target );//这个设置的是从哪个组件跳转到哪个组件,即由此方法的两个参数决定。
//这个方法第一个参数是Context对象,第二个是Class,所以如果你有一个名叫Target的Activity类,则应该
//写成Target.class,如果你有一个target对象,则应该写成target.getClass();

//上面的两行代码也可以合并成一行:
Intent intent=new Intent(this,Target.class);

//然后调用Activity类的相关方法:
startActivity(intent); //这样发出意图就可以将另一个Activity(或其他组件)调用出现在前端。

2、传递数据给另一个组件:

//首先在上面生成的intent中加入一个键值对
intent.putExtra("Da*tToSend","3.1415926535897932384626");

//然后在我们的目标组件中,比如说上面提到的Target类中接收所发送过来的数据
//首先在Target类中也是新建一个Intent(交互嘛,当然要双方都有互动的意图,这事才能成):
Intent targetIntent=getIntent();//接收别的组件所发送过来的Intent?应该还需要加上识别码之类的东西,因为可能有好几个Intent发过来

//然后把刚才第一个Activity所发送的数据接收进来,放进一个字符串变量里面:
String pi = targetIntent.getStringExtra("Da*tToSend");

3、调用另外一个Activity并且获取它执行并返回的结果:

//(1)调用Activity中的方法:
startActivityForResult(intent, requestCode);

//参数中的intent就是我们上面生成并设置好的intent对象,而requestCode是自己定义的一个int数值,用于标识这个intent的请求码,在接收传回的结果时也使用这个requestCode进行标识,因为可能有多个intent发出和传回结果,所以每个请求就有个代码加以标识。

//在本Activity类中要能够接收传回的结果,则要(2)实现以下这个方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData){
//这个方法有3个参数,首先就用到了前面所说的requestCode了。这个方法对所有的Intent返回结果进行处理,那么就要用requestCode区分是哪个互动的返回结果,以便用于触发相应的操作。假设我们发了三个intent出去,代码分别是1000、200、30:

       switch(requestCode){

               case 1000:

                       if(resultCode=1){//返回结果也可能有几种,所以也约定几个代码(resultCode)来区分,假设为1、2、3。
                                 System.out.println("把接收到的结果打印出来:"+ resultData.getExtra("return data"))
                        }else if (resultCode=2) {
                              System.out.println("返回的是第二种结果:"+ resultData.getExtra("return data"))
                         }else { }
                         break;
                 case 200:
                          //这里写入你要进行的处理程序
                          break;
                 case 30:
                          //同上。
        }
}

//上面这个方法写好后,无需进行显式调用,他在本Activity中就自动起作用了。

      那么上面这个方法中的参数resultCode和resultData从哪里来的呢,当然就是来自于上面所说的他所要互动的Target类,所以:

(3)需要在Target类中设置传回去的resultCode和resultData。
    怎么设置呢,之前我们那个Target Activity不是获取了发过来的intent生成一个targetIntent吗,调用这个方法:

      targetIntent.putExtra("retern data", "传回这个信息给你");

      //即是getIntent().putExtra("retern data", "传回这个信息给你");直接对发过来的intent进行修改。

      //然后,Activity类中有这个方法:

       setResult( 1, targetIntent );

//这个方法就是将结果返回给调用它的Activity。第一个参数就是我们上面所说的resultCode,而要传回的结果就放在targetIntent里面了,也就是上面所说的resultData,里面所包含的内容就是"传回这个信息给你"。

4、调用Android系统中一些已经为用户提供好的Intent操作。

比如说我们可以调用浏览器打开一个网址。

首先我们生成一个网址的对象:
 Uri uri=Uri.parse("http://www.163.com");
记得网址要加http://,之前我没加结果死活识别不了是一个网址,然后老是提示异常错误说找不到对应的Activity来处理Intent。因为uri不只是用来表示网址,它还可以表示其它操作,比如你也可以把它设置为Uri.parse("tel:10086"),这样就可以用于打开电话拨号应用并拨打电话骚扰移动客服。

1、然后我们新建一个Intent对象
Intent intent=new Intent();

2、设置Intent的Action
intent.setAction(Intent.ACTION_VIEW); //这个Action就是打开默认的浏览器访问网址,如果是要打电话,就是设置成ACTION_CALL,这些都是系统预设好的参数,要知道有哪些Action可用就看API文档:https://developer.android.com/reference/android/content/Intent#ACTION_CALL  中的Standard Activity Actions。

3、设置要打开的网址
intent.setData(uri);

以上三步可以合并成一步:
Intent intent=new Intent(Intent.ACTION_VIEW, uri);

4、startActivity(intent)
这样就会打开系统默认的浏览器访问上面设定好的网址了。

如上所说,以上几个步骤也可以用来调用系统中的其他功能。

 

 

上一篇:Android7.0调用照相、相册总结


下一篇:(更新,已反射hook到onActivityResult)如何避免使用onActivityResult,以提高代码可读性