zoukankan      html  css  js  c++  java
  • Android Intent (可通过URL启动 Activity)

    Intent分为两大类:

    (1)显性的(Explicit)

    (2)隐性的(Implicit)

    对于隐性意图,在某些时候, 应用程序只是想启动具有某种特征的组件, 并不想和某个特定的组件耦合. 使用Intent可以方便的达到这种高层次解耦的目的.(在模块间的组件启动

    intent定位事件的目的地:

    (1)种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。

    (2)类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。

    (3)组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。

    (4)附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。

    对于显性Intent:

    //ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class);

    1 // 明确的指定了待启动的组件类, 此时的Intent属于显式intent
    2 Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

    对于隐性Intent,分几步:

    (1) 在清单文件中的application节点下的activity下添加intent-fileter,添加的结构:

    1、 设置action

    <activity android:name=".SecondActivity">  
        <intent-filter>  
            <action android:name="com.student.query.number" />  
            <category android:name="android.intent.category.DEFAULT" />  
            <data android:scheme="studentNumber" />
        </intent-filter>
    </activity>     

    通过指定action 来设置传参启动Activity:


    1 // action 2 private final String studentQueryIntent = "com.student.query.number"; 3 // data 4 Uri studentNumberUri = Uri.parse("student:12"); 5 Intent intent = new Intent(); 6 intent.setAction(studentQueryIntent); 7 intent.setData(studentNumberUri); 8 startActivity(intent);

     2、

    <activity  android:name=".OtherActivity">  
       <intent-filter >  
           <action android:name="com.sample.student.other"/>  
           <category android:name="android.intent.category.DEFAULT"/>  
    <data android:scheme="student"
           android:host="www.student.com"
           android:port="8080"/>
    <data android:scheme="other"/> <data android:mimeType="text/*" /> </intent-filter> </activity>

    通过设置 URL 来启动相关


    1 Intent intent = new Intent(); 2 Uri data = Uri.parse("student://www.student.com:8080"); 3 intent.setData(data); 4 intent.setDataAndType(data, "text/*"); 5 startActivity(intent);

    3、关于设置具体URL path:

     1 <activity
     2             android:name=".ui.user.LoginActivity"
     3             android:screenOrientation="portrait"
     4             android:theme="@style/AppTheme">
     5             <intent-filter>
     6                 <action android:name="android.intent.action.VIEW"/>
     7 
     8                 <category android:name="android.intent.category.DEFAULT"/>
     9                 <category android:name="android.intent.category.BROWSABLE"/>
    10 
    11                 <!-- login -->
    12                 <data
    13                     android:host="www.testapp.com"
    14                     android:path="/user/login"
    15                     android:scheme="test"/>
    16             </intent-filter>
    17         </activity>

    写启动方法的时候:

    1 Uri uri = Uri.parse("test://www.testapp.com/user/login?userId=" + mUserId);
    2 
    3 startActivity(new Intent(Intent.ACTION_VIEW, uri));

    而被启动的Activity接收传参时:

    1 String userId = getIntent().getData().getQueryParameter("userId");

    getQueryParameter 只返回String 类型,所以要转换下类型。

    注意:setData方法使用

    1 //注:setData、setDataAndType、setType 这三种方法只能单独使用,不可共用。
    2 //要么单独以 setData 方法设置 URI
    3 intent.setData(uri);
    4 //如何在<data>中多了一个android:mimeType="text/*", 此时不能使用intent.setData, 而要使用intent.setDataAndType();
    5 intent.setDataAndType(uri, "text/plain");
    6 //要么单独以 setDataAndType 方法设置 Type
    7 intent.setType("text/plain");

    设置了多个data,只要匹配一个就可以启动这个activity。

    如果设置了

    1 <data android:scheme="student" 
    2    android:host="www.student.com"
    3    android:path="/studentNum"
    4    android:port="8080"/>

    必须完全匹配才能启动:

    1 Uri data = Uri.parse("student://www.student.com:8080/studentNum");

    如果设置了:

    1 <data android:scheme="student" android:host="www.student.com"/>

    那么以下URI都可以匹配:

    1 Uri data = Uri.parse("student://www.student.com:80");
    2 Uri data = Uri.parse("student://www.student.com:8800"); 
    3 Uri data = Uri.parse("student://www.student.com");

    如果只设置了:

    1 <data android:scheme="student"/>

    那么 以下URI 就可以匹配,后面也可以加其他参数:

    1 Uri data = Uri.parse("test://");

    如果设置了mimeType,那么必须使用 intent.setDataAndType(data, "text/*"); 启动activity。

    对于<intent-filter>中的action项可以有多个只要匹配其中一个就可以了。

    隐性Intent:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

  • 相关阅读:
    Eclipse JSP/Servlet 环境搭建
    1,有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
    Electron-vue实战(二)— 请求Mock数据渲染页面
    Electron-vue实战(一)—搭建项目与安装Element UI
    Electron-vue实战(三)— 如何在Vuex中管理Mock数据
    vue学习笔记(六)— 关于Vuex可以这样简单理解
    vue学习笔记(五)— 组件通信
    OpenLayers学习笔记(十二)— 飞机速度矢量线预测(二)
    QML学习笔记(八)— QML实现列表侧滑覆盖按钮
    重学JavaScript
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4876039.html
Copyright © 2011-2022 走看看