Android

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

2018-03-13  本文已影响4人  何惧l

显示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文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/but_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button 2"/>
    </LinearLayout>
    
    
  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. 通过<activity>标签下的<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开这个AndrioidManifest.xml这个文件,进行改写,action标签中指明我们可以响应com.example.activitytest.ACTION_ATART这个action,而category这个标签更加精准的指明了能够响应的Intent还可能带有category,只有这两个标签同时匹配才能响应
     <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_ATART"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    
    
  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);
            }
        });

  1. 还可以在<intent-filter>标签中再配置一个<data>标签,更加正确的指定当前活动可以响应什么类型的数据,<data>中标签只要可以配置的信息
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/but_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="Button 3"/>
</LinearLayout>

AndroidManifest文件中

<activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
            </intent-filter>
        </activity>

向下一个活动传递数据

  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);
            }
        });
  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);
    }
}

返回数据给上一层

  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);
            }
        });

  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();
            }
        });
    }
}

  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:
        }
    }

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

上一篇 下一篇

猜你喜欢

热点阅读