在活动之中穿梭

使用显式Intent

什么是Intent

  • Intent是Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据 (页面跳转)
  • Intent一般可以被用于启用活动、启动服务一级发送广播等场景
  • Intent分为两种:显示Intent和隐式Intent
  • Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?>cls)
    • 第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指想要启动那个活动
    • startActivity()方法执行Intent,启用活动
  • 实例
//显式Intent  frist_layout跳转second_layout(创建好SecondActivity活动相对的布局页面)

//在FristActivity页面构建Intent
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FristActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frist_layout);
        //通过findViewById找到Button实例
        Button button1 = (Button) findViewById(R.id.button_1);
        //setOnClickListener给按钮注册一个监听器,点击按钮时执行监听中的onClick时间,弹出Toast
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //构建一个Intent
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                //startActivity()方法执行Intent,启用活动
                startActivity(intent);
            }
        });
    }
}


使用隐式Intent

  • 相对显式Intent,隐式Intent并不明确指出要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,冰棒我们找出核实的活动去启动
  • Intent的另一个构造函数Intent intent = new Intent(action:)

  • 实例

//隐式Intent   frist_layout跳转到second_layout

//在注册AndroidManifest.xml中的<activity android:name".SecondActivity">内配置<intent-filter>标签
//<category>可以配置多个
<activity android:name=".SecondActivity">
    <intent-filter>
        //指定SecondActivity的name为com.example.activitytest.ACTION_START
        <action android:name="com.example.activitytest.ACTION_START"/>
         <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
 </activity>
                    
//在FristActivity页面构建Intent
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FristActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frist_layout);
        //通过findViewById找到Button实例
        Button button1 = (Button) findViewById(R.id.button_1);
        //setOnClickListener给按钮注册一个监听器,点击按钮时执行监听中的onClick时间,弹出Toast
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // Intent的另一个构造函数,通过action标签响应com.example.activitytest.ACTION_START
                Intent intent = new Intent("com.example.activitytest.ACTION_START");
                //<action>和<catrgory>匹配才能使用,但是由于android.intent.category.DEFAULT是一种默认的category,在调用startActivity()时会自动将cate添加到Intent中
                startActivity(intent);
            }
        });
    }
}

更多隐式Intent的用法

//隐式Intent   frist_layout跳转到百度                    
//在FristActivity页面构建Intent
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FristActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frist_layout);
        //通过findViewById找到Button实例
        Button button1 = (Button) findViewById(R.id.button_1);
        //setOnClickListener给按钮注册一个监听器,点击按钮时执行监听中的onClick时间,弹出Toast
        button1.setOnClickListener(new View.OnClickListener() {
            //隐式Intent跳转到程序外的活动
            @Override
            public void onClick(View v) {
                //指定Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置动作,其常量值为android.intent.action.VIEW
                Intent intent = new Intent(Intent.ACTION_VIEW);
                //通过Uri.parse()方法将一个网址字符串解析为Uri对象,再调用Intent的setData()方法将这个Uri值穿进去
                //setData()方法用于接收Uri.parse()方法解析出来的字符串
                intent.setData(Uri.parse("http://www.baidu.com"));
                //拨打电话
                intent.setData(Uri.parse("tel:10086"));
                startActivity(intent);
            }
        });
    }
}

//注意:为了更精确的指定当前的活动,要在<intent-filter>标签中配置<data>
<intent-filter>标签中再配置一个<data>标签,用于更精确的制定当前活动能够响应什么数据的类型
<data>标签中主要可以配置以下内容:
1.android:scheme.   用于指定数据的协议部分,如http
2.android:host      用于指定数据的主机名部分,如 www.baidu.com
3.android:port      用于指定数据的端口部分,一般紧随在主机名之后
4.android:path      用于指定主机名和端口之后的部分,如一段网络地址中跟在域名之后的内容
5.android:mimeType  用于指定可以处理的数据类型,允许使用通配符的方式进行指定

只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。
一般在<data>标签中都不会制定过多的内容,在上述实例中,只要指定android:scheme为http,就可以响应所有http协议的Intent了

向下一个活动传递数据

  • Intent中提供了一系列putExtra()方法的重载,可以将想要传递的数据暂存到Intent中,启动另一个活动后,只需要把这些数据从Intent中取出
  • 实例
//FristActivity中有一个字符串,把这个字符串传递到SecondActivity中

//在FristActivity页面构建Intent
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FristActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frist_layout);
        //通过findViewById找到Button实例
        Button button1 = (Button) findViewById(R.id.button_1);
        //setOnClickListener给按钮注册一个监听器,点击按钮时执行监听中的onClick时间,弹出Toast
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //定义一个字符串
                String data = "Hello SecondActivity!";
                //构建一个Intent,FristActivity向SecondActivity传递data,此处是一个显式Intent
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                //putExtra()方法将data暂时存在Intent中,putExtra()方法有两个参数,第一个是键,用于后面从Intent中取值,第二个参数里是真正传递的参数
                intent.putExtra("extra_data",data);
                //执行Intent
                startActivity(intent);
            }
            
        });
    }
}

//在SecondActivity中将传递的数据取出来,并打印
package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        //getIntent()方法获取到用于启动SecondActivity的Intent
        Intent intent = getIntent();
        //调用getStringExtra()方法获取FristActivity传递的数据
        // 整型数据用getStringExtra()方法,布尔型数据用getSBooleanExtra()方法
        String data = intent.getStringExtra("extra_data");
        //打印
        Log.d("extra_data",data);		//打印结果:2020-12-31 17:27:46.487 17690-17690/com.example.activitytest D/extra_data: Hello SecondActivity!
    }
}

返回数据给上一个活动

  • Activity中还有一个startActivityForResult()方法,也是用于启用活动,但这个方法期望在活动销毁的时候,能够返回一个结果给上一个活动。
  • startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源
  • setResult()方法专门向上一个活动返回数据
  • 实例
//FristActivity
package com.example.activitytest;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FristActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frist_layout);
        //通过findViewById找到Button实例
        Button button1 = (Button) findViewById(R.id.button_1);
        //setOnClickListener给按钮注册一个监听器,点击按钮时执行监听中的onClick时间,弹出Toast
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //构建一个Intent
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                //使用startActivityForResult()方法来启动SecondActivity,请求码只要一个唯一值
                startActivityForResult(intent,1);
            }
            
        });
    }
}
//给SecondActivity中的按钮注册点击事件,并在点击事件中添加返回数据的逻辑
package com.example.activitytest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //构建一个用于传递数据的Intent
                Intent intent = new Intent();
                //putExtra()方法将传递的数据存到Intent中
                intent.putExtra("data_return","Hello FristActivity!");
                //setResult()方法向上一个活动返回数据,第一个值返回数据结果,第二个值返回传递的数据
                setResult(RESULT_OK,intent);
                //销毁当前活动,返回上一个活动
                finish();
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值