• Android: Intent实现活动之间的交互


      

      Intent的作用:是Android中各个组件直接交互的一种重要方式,且利用Intent可以启动Activity、Service以及Broadcast Receiver。

      Intent的创建:显示和隐式。

      接下来,使用代码演示Intent的各种应用。

      1、首先,创建一个工程,然后在res/layout目录下新建两个布局文件,分别是activity_main.xml和second.xml,代码如下

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.banniyang.intentdome.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button1"/>
    </LinearLayout>

    second.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.banniyang.intentdome.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Second Hello World!" />
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="button2"/>
    </LinearLayout>

      在activity_main.xml中添加一个TextView和Button,并且标记Button1的唯一ID为button1,

      在second.xml中添加一个TextView和Button,并且标记Button2的唯一ID为button2。

      2、然后在/app/src/main/java目录下新建一个活动second,使其继承AppCompatActivity,然后重写onCreate()方法,代码如下:

    public class Second extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.second); //layout资源文件下的布局文件
        }
    }

      3、在AndroidMainfest.xml工程配置文件中注册活动second

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.banniyang.intentdome">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".Second"></activity>
        </application>
    
    </manifest>

      4、MainActivity.java的具体代码如下

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button1 = (Button) findViewById(R.id.button1);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                     //实现活动之间的跳转,显式构建
                     Intent intent = new Intent(MainActivity.this, Second.class);
                     //启动intent
                     startActivity(intent);
                }
            });
        }
    }

      上面Intent的构建采用的是显式的方式,下面用隐式的方法,即不明确指出要启动哪个活动,而是抽象的指定一系列的action和category等信息

      1、打开AndroidManifest.xml文件重新编写activity的内容

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.banniyang.intentdome">
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Second">
            <intent-filter >
                <action android:name="com.example.intentdome.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>
    
    </manifest>

          2.重新编写MainActivity.java的按钮点击事件

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button1 = (Button) findViewById(R.id.button1);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /*  //实现活动之间的跳转,显式构建
                     Intent intent = new Intent(MainActivity.this, Second.class);
                     //启动intent
                     startActivity(intent);  */
                    Intent intent = new Intent("com.example.intentdome.ACTION_START");
                    startActivity(intent);
                }
            });
        }
    }

      运行可以得到同样的结果。

      使用隐式启动其他程序内部活动

      示例:通过自己本程序去调用系统的浏览器来打开一个博客的网页操作

      重新编写MainActivity.java的按钮点击事件

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button1 = (Button) findViewById(R.id.button1);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
              //打开浏览器应用
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("http://www.cnblogs.com/longzhongren/"));
                    startActivity(intent);
                }
            });
        }
    }

      Intent实现活动中数据的传递

         设置数据

       Intetn提供了一个putExtra()方法用于以键-值对的形式进行数据的存放,将传递的数据存放在Intent中,

    启动一个活动到另一个活动时,只需要从Intent中获取数据即可

      1、重新编写MainActivity.java的按钮点击事件

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button1 = (Button) findViewById(R.id.button1);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                   intent.putExtra("data", "Hello SecondActivity");
                   startActivity(intent);
                }
            });
        }
    }

         获取数据

       可以通过getStringExtra()方法获取存放的数据

      2、重新编写Second.java的按钮点击事件

    public class Second extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.second);
    
            Button button2 = (Button)findViewById(R.id.button2);
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   String tmp = getIntent().getStringExtra("data");
                   Toast.makeText(Second.this, tmp, Toast.LENGTH_SHORT).show();
    
                }
            });
        }
    }

    getIntent()解释:Return the intent that started this activity.

      携带数据返回上一个活动

      1、重新编写MainActivity.java的按钮点击事件

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button1 = (Button) findViewById(R.id.button1);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                   //第一个参数:Intent对象,第二个参数:请求的结果码
                   startActivityForResult(intent, 1);
                }
            });
        }
    }

      2、重新编写Second.java的按钮点击事件

    public class Second extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.second);
    
            Button button2 = (Button)findViewById(R.id.button2);
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                      Intent intent = new Intent();
                      //设置要返回的值
                      intent.putExtra("data_return", "我已经返回上一层了");
                      //设置返回结果
                      setResult(RESULT_OK, intent);
                      //结束当前activity
                      finish();
                }
            });
        }
    }

      由于设置了starActivityForReturn()方法来启动Second,在Second被销毁之后会调用一个活动的onActivityResult()方法,所以要

      3、在MainActivity.java中添加onActivityResult()方法

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
    
            switch (requestCode) {
                case 1:
                    if (resultCode == RESULT_OK) {
                        Toast.makeText(this, data.getStringExtra("data_return"), Toast.LENGTH_SHORT).show();
                    }
                    break;
    
                default:
                    break;
            }
        }

     程序猿必读

  • 相关阅读:
    linux安装oracle
    echarts柱状图,改变柱状颜色
    JS实现键盘监听(包括组合键)
    css根据屏幕大小切换样式
    (转)Win10下PostgreSQL10与PostGIS安装
    navicat连接PostgreSQL报:column “rolcatupdate” does not exist ...错误的解决办法
    大屏FAQ
    大屏介绍
    大屏模板制作
    大屏做成这样,领导不重用你都难
  • 原文地址:https://www.cnblogs.com/longzhongren/p/6089749.html
Copyright © 2020-2023  润新知