zoukankan      html  css  js  c++  java
  • android 学习随笔十四(页面跳转与数据传递)

    1、activity

    • 创建第二个Activity
    • 需要在清单文件中为其配置一个activity标签
    • 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标

    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    • 一个应用程序可以在桌面创建多个快捷图标。
    • activity的名称、图标可以和应用程序的名称、图标不相同

    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.ecollab.createactivity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="21" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="main" 
                android:icon="@drawable/photo1"
                >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.ecollab.createactivity.SecondAcitivity"
                android:label="second"
                android:icon="@drawable/photo2"
                >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    配置清单文件

    2、activity的跳转

    Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity

    •  隐式跳转,通过指定动作实现跳转,称为隐式意图
      • 隐式意图跳转至指定Activity

    Intent intent = new Intent();
    //启动系统自带的拨号器应用
    intent.setAction(Intent.ACTION_DIAL);
    startActivity(intent);

      • 要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点

    <intent-filter >
    <action android:name="com.itheima.second"/>
    <data android:scheme="asd" android:mimeType="aa/bb"/>
    <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

      • action 指定动作(可以自定义,可以使用系统自带的)
      • data 指定数据(操作什么内容)
      •  category 类别 (默认类别,机顶盒,车载电脑)
      • 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配

    启动不同应用中的Activity,用隐式

    系统会在所有清单文件中寻找与程序员创建的intent匹配的intent-filter,找到则启动,找不到则抛异常
    * 匹配就是intent-filter中定义了什么属性,程序员创建的intent中也必须设置什么属性
    * 在清单文件的activity标签下,配置intent-filter子节点,其中再配置action和category

    //隐式意图,跳转外部应用:如果JAVA代码没有匹配cateroy,系统默认添加category

    Intent intent = new Intent();
    intent.setAction(intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:110"));//tel是在清单文件scheme定义的
    startActivity(intent);

    //清单文件加权限<uses-permission android:name="android.permission.CALL_PHONE"/>

    • 显示跳转,通过设置Activity的包名和类名实现跳转,称为显式意图
      • 跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可

    Intent intent = new Intent();
    intent.setClass(this, SecondActivity.class);
    startActivity(intent);

      • 跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名

    Intent intent = new Intent();
    //启动系统自带的拨号器应用
    intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
    startActivity(intent);

    启动同一应用中的Activity,用显式,显式启动效率高于隐式

    * 同一应用中,指定目标Activity的字节码和当前的上下文
    * 不同应用中,指定目标Activity所在的应用的包名和目标Activity的包名加类名

    -------------------------------------------------------------------------

    显示调用外部应用

    Intent intent = new Intent();
    //arg0:目标Activity所在的应用的包名
    //arg1:目标Activity的类名,注意要带上包名
    intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
    intent.setData(Uri.parse("tel:11670"));
    startActivity(intent);

    -------------------------------------------------------------------------

    如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择

     -----------------------------------------------------------------------------------------------------------------------

    <activity
    android:name="com.ecollab.createactivity.SecondAcitivity"
    android:label="second"
    android:icon="@drawable/photo2"
    >
    <intent-filter>
    <action android:name="a.b.c" />
    <action android:name="a.b.c3" />
    <data android:scheme="ecollab"/>
    <data android:scheme="ecollab3" android:mimeType="text/name"/>
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
    <action android:name="a.b.c2" />
    <data android:scheme="ecollab2"/>
    <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    </activity>

    ----------------------------------------------------------------------------------------------------

    Intent intent = new Intent();
    intent.setAction("a.b.c");
    //匹配mimetype,此方法要放在setData前面,因为它会清空setData设置的数据,有“android:mimeType”定义,就必须匹配设置
    // intent.setType("text/name");
    //匹配scheme,它会清空setType设置的数据
    // intent.setData(Uri.parse("ecollab:低头思故乡"));
    intent.setDataAndType(Uri.parse("ecollab:低头思故乡"), "text/name");
    startActivity(intent);

    -------------------------------------------------------------------------------------------------------------

    3、获取setData封装的数据

    //获取启动该ACTIVITY的意图对象
    Intent intent = getIntent();
    //获取封装在Intent中的数据
    Uri uri = intent.getData();

    4、显式意图和隐式意图的应用场景

    * 显式意图用于启动同一应用中的Activity
    * 隐式意图用于启动不同应用中的Activity

    *显式意图效率高于隐式意图
    * 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个

    ---

    5、显式传递数据

    ---------------------------------------------------------------------------------------------------------------------------------

    EditText et_malename = (EditText) findViewById(R.id.tv_malename);
    EditText et_femalename = (EditText) findViewById(R.id.tv_femalename);

    String malename = et_malename.getText().toString();
    String femalename = et_femalename.getText().toString();

    //跳转到secondActivity计算
    Intent intent = new Intent(this, SecondActivity.class);
    //传递数据,intent中可以封装数据,数据有八大今本数据类型和字符串及其数组,还有实现了序列化接口的对象
    //以及bundle对象
    //intent.putExtra("malename", malename);
    //intent.putExtra("femalename", femalename);

    //Bundle中也可以用键值对封装数据,封装类型与Intent一致
    Bundle bundle = new Bundle();
    bundle.putString("malename", malename);
    bundle.putString("femalename", femalename);
    intent.putExtras(bundle);
    startActivity(intent);

    -----------------------------------------------------------------------------------------------------------------------------------

    Intent intent = getIntent();
    //String malename = intent.getStringExtra("malename");
    //String femalename = intent.getStringExtra("femalename");

    Bundle bundle = intent.getExtras();
    String malename = bundle.getString("malename");
    String femalename = bundle.getString("femalename");

  • 相关阅读:
    mysql--连接查询(内外连接)
    Mysql--select基础查询
    Mysql--数据定义语言(DDL)
    Mysql--数据操作语言(DML)
    java--String、StringBuilder、StringBuffer的解析和比较?
    Java--equals和 == 的比较和equals()、HashCode()的重写
    Mysql--数据类型
    Mysql--约束
    SpringCloud版本说明
    springBoot 发送邮件
  • 原文地址:https://www.cnblogs.com/ecollab/p/5898723.html
Copyright © 2011-2022 走看看