Intent

Intent 是一个消息传递对象。

Intent 可以通过多种方式促进组件之间的通信,基本用例主要包括三个:

1.启动Activity 2.启动服务 3.传递广播

1.Intent类型

Intent分为两种类型:

  • 显示Intent

创建显示Intent启动Activity或者服务时候,系统将立即启动Intent对象中指定的应用组件。

Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);

Intent第一个参数是启动活动的上下文,第二个参数class是指定想要启动的活动。

然后在通过Acitvity提供的startActivity()方法来启动活动。

注意:启动服务时必须使用显示Intent

  • 隐式Intent

创建隐式Intent时,将会在设备上的其它应用的清单文件中声明的Intent过滤器进行比较,找到匹配结果并启动该组件,如果有多个匹配结果,则系统会提供一个对话框,来让用户选择。

 Intent intent1=new Intent("com.tiger.secondactivity");
 intent1.addCategory("android.intent.category.DEFAULT");
 startActivity(intent1);
        <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.tiger.secondactivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

注意:清单文件中需要写出对应<Intent filter>

​ 每个Intent只能指定一个action,但是能够绑定多个category。

2.Intent之间的数据传递

(1) 向下一个活动传递数据

  • 发送数据
                  Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                  intent.putExtra("data1","data111");
                  intent.putExtra("data2",123);
                  //3. 注意:如果传递的对象集合,那么对象应该实现 Serializable 接口
                   intent.putExtra("listData",(Serializable) mCostBeanList); 
                  startActivity(intent);
  • 接收数据
          String data1= getIntent().getStringExtra("data1");
          int data2= getIntent().getIntExtra("data2",0);
          // 3.
          List<CostBen> mCostList=(List<CostBen>)getIntent().getSerializableExtra("costList");

Intent 中提供了一系列的putExtra() 方法重载,支持我们传递各种数据类型,然后在另一个活动中再通过getIntent().get[数据类型](“name”,默认值)来获取传递过来的值,存储的方式类似于键值对。

如果数据较多的话我们可以通过 :

Bundle bd= getIntent().getExtras();
String data1= bd.getString("data1");

(2)返回数据给上一个活动

首先我们需要修改启动方式为 startActivityForResult(),第二参数是请求码,用于在之后的回调中判断数据的来源。

  • 在MainActivity中启动 SecondActivity
     Intent intent=new Intent(MainActivity.this,SecondActivity.class);
     startActivityForResult(intent,1);
  • 在SecondActivity 中返回数据给MainActivity
     Intent intent=new Intent();
     intent.putExtra("data3","data333");
     setResult(RESULT_OK,intent); //向上一个活动返回数据
     finish(); //销毁当前活动
  • 在MainActivity中接收返回值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode==1){ //这个就说我们启动活动时指定的请求码
            if(resultCode==RESULT_OK){  //这个是我们 setResult()时指定的值
                String data3=data.getStringExtra("data3");
            }
        }
    }

3.常用Intent:

//1.返回桌面
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_HOME);
                startActivity(intent);
//2.打开 Google
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.google.com"));
                startActivity(intent);
//3.打开拨号界面
                Intent intent=new Intent();
                                // ACTION_CALL 表示直接拨过去,需要申请权限
                intent.setAction(Intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:10086"));
                startActivity(intent);
 //4.给10086发送内容为“Hello”的短信
                Uri uri = Uri.parse("smsto:10086");
                Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
                intent.putExtra("sms_body", "Hello");
                startActivity(intent);
 //5.打开设置界面 (可以修改不同的Action跳转到不同的设置界面)
                Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
                startActivityForResult(intent, 0);

更多请参考:

https://developer.android.com/guide/components/intents-filters.html

https://developer.android.com/guide/components/intents-common.html

Last modification:July 12th, 2020 at 07:48 pm