• android第一行代码-3.activity之间的调用跟数据传递


    前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始。

    主要内容包括intent的使用,以及activity之间的数据传递。

    假设有两个activity,MainActivity跟SecondActivity,其中MainActivity是主活动,现在MainActivity需要调用SecondActivity,则可以用以下两种方式。

    1.activity跳转

    (1)显示intent:使用显示intent,需要增添的配置只有调用方的activity

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            final Button btn_intent = (Button) findViewById(R.id.intent_btn);
            
            btn_intent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    ...
    }

    如上述代码,通过点击btn_intent这个button,就可以调用SecondActivity。Intent(Context packageContext, Class<?> cls) 。这个构造函数接收两个参数,第一个参数 Context 要求提供一个启动活动的上下文,第二个 参数 Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出 Intent 的“意图”。 调用意图,使用startActivity即可。

    (2)隐式intent

    使用隐式intent可以不用指定activity,而只需要调用action name即可。

    首先在AndroidManifest.xml中配置action跟category,这两者可以组成intent的过滤器

            <activity android:name=".SecondActivity" >
                <intent-filter>
                    <action android:name="com.example.activitytest.ACTION_START" />
                    <!--<category android:name="android.intent.category.DEFAULT" />-->
                    <category android:name="com.example.activitytest.MY_CATEGORY" />
                </intent-filter>
            </activity>

    当MainActivity需要调用SecondActivity时,可以调用intent的另一个构造方法

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            final Button btn_intent = (Button) findViewById(R.id.intent_btn);
    
            btn_intent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.activitytest.ACTION_START");
                    #如果category配置的是default,则此处可以不用加category
                    intent.addCategory("com.example.activitytest.MY_CATEGORY");
                    startActivity(intent);
                }
            });
        }
    ...
    }

    ps:隐式调用更像是前端中常用的模式,通过给activity标示唯一识别符,然后需要用到时则通过唯一识别符来调用。而不用像显式调用那样,在编码时必须熟知调用的主从关系。

     另外隐式调用的好处是隐式调用不仅可以启动自己程序内的活动,还可以启动其他程序的活动, 这使得 Android 多个应用程序之间的功能共享成为了可能。

    (3)程序间的调用(隐式调用+)

            sys_btn_intent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("http://www.baidu.com"));
                    startActivity(intent);
                }
            });

    其中ACTION_VIEW代表调用的是系统本身的activity

    2.activity间数据传递

    (1)数据传递

    MainActivity中有一个字符串,现在想把这个字符串传递到SecondActivity,可以用putExtra跟getStringExtra在activity之间传递数据

    MainActivity需要传递data给SecondActivity,具体使用如下:

    MainActivity(sender):

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String data = " hello world!";
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    intent.putExtra("extra_data",data); //{"extra_data":data}
                    startActivity(intent);
                }
            });

    SecondActivity(receiver):

    public class SecondActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.second_layout);
            
            //通过intent获取数据
            Intent intent = getIntent();
            String data = intent.getStringExtra("extra_data");
            Toast.makeText(SecondActivity.this,data,Toast.LENGTH_SHORT).show();
    
        }
    }

    (2)数据返回

    因为数据返回,一般是activity的销毁,而不是调用,因此跟(1)中的方式不一样。假设现在需要从SecondActivity返回数据给MainActivity:

    SecondActivity

    public class SecondActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            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 = new Intent();
                    intent.putExtra("data_return", "Hello MainActivity");
                    //绑定result_code跟intent内容
                    setResult(RESULT_OK,intent);
                    finish();
                }
            });
    
        }
    }

    MainActivity需要接受的参数有:一个是request_code,一个是result_code,最后一个是intent。

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
            final Button button = (Button) findViewById(R.id.button_1);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivityForResult(intent, 200);
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
            switch (requestCode){
                case 200:
                    if (requestCode == RESULT_OK){
                        String returnedData = data.getStringExtra("data_return");
                        Log.d("MainActivity", returnedData);
                    }
                    break;
                default:
            }
        }
    ...
    }

    3.在Bundle中传递跟保存数据

    Bundle中传递跟保存数据是为了防止activity调用时,当前activity如果需要在onDestory时保存一些临时数据,则可以用onSaveInstanceState这个构造函数。

    保存数据:

        @Override
        protected void onSaveInstanceState(Bundle outState){
            super.onSaveInstanceState(outState);
            String tempData = "Something you just typed";
            outState.putString("data_key",tempData);
        }

    取出数据:

    public class ActivityLifeCycleTest extends AppCompatActivity {
    
        public static final String TAG = "MainActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate");
            Toast.makeText(ActivityLifeCycleTest.this,TAG+"===onCreate==",Toast.LENGTH_SHORT).show();
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_activity_life_cycle_test);
            if (savedInstanceState != null){
                String data = savedInstanceState.getString("data_key");
                Log.d(TAG, data);
            }
    ...
    }
  • 相关阅读:
    Java 必看的 Spring 知识汇总
    java与C#的基础语法区别--持续更新
    MQTT协议-MQTT协议解析(MQTT数据包结构)
    MQTT协议-MQTT协议简介及协议原理
    RabbitMQ与AMQP
    JMS、AMQP和MQTT主要特性
    socket 极值数量
    redis.conf详细说明
    Redis 模糊匹配 SearchKeys
    Parallel
  • 原文地址:https://www.cnblogs.com/alexkn/p/5449516.html
Copyright © 2020-2023  润新知