02探究活动-使用Intent在活动中穿梭

显示Intent的使用

  1. 首先再定义一个SecondActivity.java文件,
  public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
    }
}
  1. 在写一个second_layout.xml文件
    
    
    
        
  2. 修改FristActivity中的按钮点击事件
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    
    
    • 首先构造了一个Intent,传入FrinstActivity.this作为上下文,然后传入要去的布局,最后通过这个startActivity()方法来执行

隐式Intent用法

  1. 它并不明确的指明想要启动哪一个程序,而是指定更为抽象的action和category等信息,然后交由系统分析这个Intent,并帮我们找到合适的活动去启动
  2. 通过标签下的的内容,可以指定当前活动能够响应的action和category,打开这个AndrioidManifest.xml这个文件,进行改写,action标签中指明我们可以响应com.example.activitytest.ACTION_ATART这个action,而category这个标签更加精准的指明了能够响应的Intent还可能带有category,只有这两个标签同时匹配才能响应
     
            
                
                
            
        
    
    
  3. 改变鼠标点击事件,这个时候并没有写这个category这个标签,但是还是能够响应,因为android.intent.category.DEFAULT是一种默认的category,会自动的添加
  Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 这里面是action的值
                Intent intent = new Intent("com.example.activitytest.ACTION_ATART");
                startActivity(intent);
            }
        });

更多隐式Intent的用法

  1. 使用隐式的Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动,比如想要在程序中显示一个网页,这个时候就只要调用系统的网页就可以了,修改FirstActivity.xml
        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent);
            }
        });

  • 这里指定的action是Intent.ACTION_VIEW,这是一个内置的,通过这个Uri.parse()方法可以把一个网址解析成一个Uri对象,再通过Intetn的setData方法把这个对象传进去,再startActivity打开,这个时候点击这个按钮,进入的就是百度页面


    2018-03-12_16-45-14.png
  1. 还可以在标签中再配置一个标签,更加正确的指定当前活动可以响应什么类型的数据,中标签只要可以配置的信息
  • android:scheme 用于指定数据的协议部分,
  • android:host 用于指定数据的主机名
  • androdi:port 用于指定数据的端口部分
  • android:path 用于指定主机名和端口之后的部分
    只有data标签中指定的内容和Intent携带的Data完全一致,当前活动才能够响应该Intetn
    例如:FirstActivity.xml不用动,新建一个ThirdActivity(内容不用动),布局文件third_layout



    

AndroidManifest文件中


            
                
                
                
            
        

  • 这个时候我们通过指定了协议必须是http协议,这样ThirdActivity就可以象浏览器一样响应一个打开网页Intent了


    2018-03-12_18-52-25.png

向下一个活动传递数据

  1. 使用的是Intetn提供的putExtra()方法,可以把想要传递的数据暂存起来,然后到下一个活动中取出来就可以了,修改FristActivity中的代码

        Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                String data = "我是要传递的数据";
                intent.putExtra("data",data);
                startActivity(intent);
            }
        });
  • 点击这个按钮的时候,会到Second的布局中,这个时候调用了intent的putExtra()方法,传入的是键,和值,还是使用的startActivity()的方式来启动
  1. 在SecondActivity中就可以获取到存入的数据了

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        
        Intent intent = getIntent();
        String data = intent.getStringExtra("data");
        Log.d("SecondActivity",data);
    }
}

  • 首先通过getIntent()方法获取到用去启动SecondActivity的Intent,然后调用相应的方法getStringExtra(),传入键就可以了,若传入的是整形,那就使用getIntExtra()方法,查看logcat打印的信息就可以看到了


    2018-03-12_17-55-32.png

返回数据给上一层

  1. 这个时候就必须的使用Activity中的startActivityforResult()方法来启动活动了,这个方法期望在这个活动摧毁的时候可以传递一个数据给上一个活动,这个方法里有两个参数,第一个还是Intent,第二个是请求码,用于在之后的回调中判断数据的来源,修改一下FirstActivity中按钮的点击事件
   Button but_1 = (Button)findViewById(R.id.but_1);
        but_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(FristActivity.this,SecondActivity.class);
                // 这里启动活动的方法变了
                startActivityForResult(intent,1);
            }
        });

  • 这里使用了 startActivityForResult()方法启动活动,请求码必须得唯一
  1. 在SecondActivity中给按钮注册点击事件

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Button but_2 = (Button)findViewById(R.id.but_2);
        but_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data_return","我是向上传递的数据");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}

  • 首先还是构建了一个Intent,调用Intent的putExtra()方法存入数据,
  • 然后调用了setResult()方法,这个方法非常重要,用于向上返回数据,第一个参数是用于向上一个活动返回处理结果集,一般就只有RESULT_OK或者RESULT_CANCELED这两个参数,第二个参数是把带有数据的intent返回
  • 最后调用finish()方法销毁当前的活动
  1. 由于是使用startActivityForResult()方法启动SecondActivity,那么在SecondActivity销毁的之后就会回调上一个活动的onActivityResult()方法,所以在FristActivity中重写这个方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnData = data.getStringExtra("data_return");
                    Log.d("FristActivity",returnData);
                }
                break;
            default:
        }
    }

  • 第一个参数就是在启动活动的时候传入的请求码(唯一)
  • 第二个参数是返回数据的时候传入的处理结果
  • 第三个参数是携带数据的intent


    2018-03-12_18-29-51.png
  1. 这个时候如果没有在SecondActivity界面点击按钮,而是直接使用Back键返回的,这样的话数据就返不回来了,所以在SecondActivity中重写这个onBackPressed()
  @Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","我是通过返回键向上传递的数据");
        setResult(RESULT_OK,intent);
        finish();
    }

  • 当按到Back键的时候,就会执行这个方法onBackPressed()


    2018-03-12_18-35-38.png

你可能感兴趣的:(02探究活动-使用Intent在活动中穿梭)