zoukankan      html  css  js  c++  java
  • Android Intent实现界面跳转、程序跳转

    一个程序往往由多个界面组成,界面之间的跳转,实质是Activity之间的跳转。

    从当前程序跳转到其它程序,实质是启动了目标程序的入口Activity。

    Intent被称为意图,常用于组件之间的交互,可用于启动其它组件、程序,并可以在组件之间传递数据。

    1、显式意图     直接指定要启动的目标组件

    方式一:

    1   //参数:package的上下文对象,通常用this表示当前package的。目标Activity的class对象,不用写全类名
    2    Intent intent=new Intent(this,Main2Activity.class);
    3    startActivity(intent);

     方式二:

    1   Intent intent=new Intent();
    2 
    3   //参数:package的上下文对象,目标Activity的class对象
    4   intent.setClass(this,Main2Activity.class);
    5 
    6   //或者用另一个重载函数。package的上下文对象,全类名(String类型)。必须是全类名
    7   //intent.setClassName(this,"com.example.test.Main2Activity");
    8 
    9   startActivity(intent);

    以上两种方式均只能启动本程序中组件,不能启动其它程序的组件。(this限定了)

    方式三:

    1   Intent intent=new Intent();
    2   //包名,全类名。均为String型。只要是String型的类名,都要写成全类名。    
    3   intent.setClassName("com.example.test","com.example.test.Main2Activity");
    4   startActivity(intent);

    方式四:

    1   Intent intent = new Intent();
    2   //创建一个组件对象。包名,全类名,均为String类型。
    3   ComponentName comp = new ComponentName("com.example.test","com.example.test.Main2Activity");
    4   //设置Intent的目标组件
    5   intent.setComponent(comp);
    6   startActivity(intent);

    以上2种方式既可以启动本程序的其他组件,也可以启动第三方程序(的组件):将包名、全类名设置为其它程序的即可。

    如果要启动第三方程序,全类名要是入口Activity的全类名。

    只要参数是String类型的类名,就必须写成全类名。

    2、隐式意图      并不直接指定要开启的目标组件,而是指定目标组件的action,系统根据action的映射关系启动某个组件/程序。

    方式一:

    1  Intent intent=new Intent();
    2         //指定目标组件的action的name,String类型。我这里写的是形参声明,实际使用时要替换为具体的字符串
    3         intent.setAction(String action);
    4         startActivity(intent);

    方式二:

    1  //参数:目标Activity的action的name值,String类型
    2         Intent intent = new Intent(String action);
    3         startActivity(intent);

    启动action值为指定值的组件。

    以上2种方式可以启动本程序的其它Activity、也可以启动手机上的其它程序。

    启动本程序中的其他Activity,需要自己在AndroidManifest.xml中给目标组件配置action

    在AndroidManifest.xml中为目标组件配置<intent-filter>元素:

    1 <activity android:name=".Main2Activity">
    2         <intent-filter>
    3                 <!--action元素标识此组件的分类,如果此组件是程序的入口Activity,则action元素可标识此程序的分类-->                                
    4                 <action android:name="test" />
    5                 <!--category的值有2个:一般是DEFAULT,表示这是一个普通的组件;LAUNCHER,表示这是此程序的入口组件-->
    6                 <category android:name="android.intent.category.DEFAULT"/>
    7        </intent-filter>
    8 </activity>    

    在AndroidManifest.xml中设置的Activity的action是Android系统共用的,就是说此action可以被其它程序引用。

    action值可以是任意的字符串,但习惯这样写:  包名.常量名   ,常量名自己取,全大写,尽量见名知义。示例:cn.itcast.START_SECOND_ACTIVITY。

    action值也可以使用预定义的值,这些预定义的值都是String类型的常量。

    action更像是对组件/程序功能的分类,比如action是"浏览网页",现在我们通过隐式意图启动action是"浏览网页"的组件/程序:

    如果手机上只有一个组件的action是"浏览网页"(即只有一个浏览器),则直接打开该浏览器。

    如果有多个浏览器,但设置了默认应用,则直接打开默认浏览器。

    如果有多个浏览器,但未设置默认应用,则会弹出对话框,显示action是"浏览网页"的所有组件/应用(即显示所有浏览器),让用户选一个。

    我们可以给本程序的某个Activity指定唯一的action,这样通过该action可直接启动该组件。

    预定义的action的组件往往是手机通用的功能(系统应用),比如读取联系人、打电话、发短信、发邮件、播放多媒体文件、浏览器等。预定义的action值往往不能直接像上面的2种方式一样:指定了action后就    startActivity(intent);   直接启动,常常要设置一些参数、传递一些数据后才能   startActivity(intent);    比如播放媒体文件,要先设置/传递 文件类型(audio/mp3)、文件位置。

    startActivity()可以开启一个组件,也可以开启一堆组件:

    startActivity(Intent  intent);

    startActivity(Intent[]  intents);

     下一篇随笔写如何获取第三方软件的包名、入口类名,下下篇随笔写如何使用预定义的action值。

  • 相关阅读:
    Linux Shell 编程
    Linux下压缩与解压
    rsync实现文件备份同步
    linux中ulimit作用
    3dmax卡通渲染插件pencil+渲染线框
    世嘉开发部部长:这3点能提升游戏留存率
    消息中间件 分布式
    高并发高性能
    你的系统如何支撑高并发
    分布式系统的阿喀琉斯之踵:数据一致性
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/10873301.html
Copyright © 2011-2022 走看看