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("DataIWantToSend","3.1415926535897932384626");//然后在我们的目标组件中,比如说上面提到的Target类中接收所发送过来的数据
 //首先在Target类中也是新建一个Intent(交互嘛,当然要双方都有互动的意图,这事才能成):
Intent targetIntent=getIntent();//然后把刚才第一个Activity所发送的数据接收进来,放进一个字符串变量里面:
String pi = targetIntent.getStringExtra("DataIWantToSend");

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#standard-activity-actions  。

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

以上三步可以合并成一步:

Intent intent=new Intent(Intent.ACTION_VIEW, uri);

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

如上所说,以上几个步骤也可以用来调用系统中的其他功能,不过有些功能需要在manifest中添加相应的权限。

5、1〉启动另外一个app:

Intent targetApp=getPackageManager().getLaunchIntentForPackage("com.lxq.applocker");
 startActivity(targetApp);

      2〉 使用app名称起动另外一个app:

 
Intent intent = getIntentByName("应用名称");
startActivity(intent);
 // 通过应用名称,来获取应用的  Intent 的方法
         public Intent getIntentByName(String name) {
                 PackageManager pm = getApplicationContext().getPackageManager();
                 List<PackageInfo> allApps = pm.getInstalledPackages(0); // 获取本地所有已经安装的应用
                 Intent intent = null;
                 if (null != allApps && null != name) {
                         for (PackageInfo pi : allApps) {
                                 // 在本地已经安装应用中比较应用名称
                                 if (name.equals(pi.applicationInfo.loadLabel(pm))) {
                                         intent = pm.getLaunchIntentForPackage(pi.packageName);
                                         break;
                                 }
                         }
                 }
                 return intent;
         }

        3〉第三种方法:


//打开app
void openApp(String appName){
    PackageManager packageManager = getPackageManager();
        Intent intent = packageManager.getLaunchIntentForPackage(getPackageName(appName));
        startActivity(intent);
}

//调用app的属性页(info)
void openAppInfo(String appName){
    Intent intent =  new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("package:" + getPackageName(appName)));
    startActivity(intent);

}

//获取app的包名
String getPackageName(String appName){
    String packageName="";
    PackageManager pm = getApplicationContext().getPackageManager();
    List<PackageInfo> allApps = pm.getInstalledPackages(0); // 获取本地所有已经安装的应用
    if (null != allApps && null != appName) {
        for (PackageInfo pi : allApps) {
            // 在本地已经安装应用中比较应用名称,找到目标app的包名
            if (appName.equals(pi.applicationInfo.loadLabel(pm))) {
                packageName = pi.packageName;
            }
        }
    }
    return packageName;
}