Intent实现Activity的跳转

Intent实现Activity的跳转

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
    Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service/BroadcastReceiver之间的交互。也可以说---- Intent是同一个或不同的应用中的组件之间的消息传递的媒介。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
    简而言之:Intent用来激活组件;携带信息。
    在SDK中给出了Intent作用的表现形式为:
    通过Context.startActivity() orActivity.startActivityForResult() 启动一个Activity; 
    通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互; 

Context.sendBroadcast(),Context.sendOrderedBroadcast(),
Context.sendStickyBroadcast()) 发给broadcast receivers。

Activity的跳转

    Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity。Activity跳转一共有两类:一类为显式意图;一类为隐式意图。
    通过设置Activity的包名和类名实现跳转,称为显式意图
    通过指定动作实现跳转,称为隐式意图 
显式意图
  • 同一应用中,指定目标Activity的字节码和当前的上下文
  • 不同应用中,指定目标Activity所在的应用的包名和目标Activity的包名加类名

    跳转至同一应用下的另一个Activity,直接指定该Activity的字节码即可
    /**
     * 跳转至SecondActivity
     * 在本应用中跳转
     * 显示跳转:直接指定目标Activity的包名和类名
     * @param v
     */
    //显式启动SecondActivity
    public void click1(View v){
        //这个是显式意图
        Intent intent = new Intent();
        //设置上下文和目标Activity的字节码
        intent.setClass(this, SecondActivity.class);
        startActivity(intent);
    }
    

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

    /**
     *  显式启动拨号器
     */
    public void click2(View v){
        Intent intent = new Intent();
        //arg0:目标Activity所在的应用的包名
        //arg1:目标Activity的类名,注意要带上包名
        intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }
    

    备注:获取拨号器的包名和类名,只需要打开Logcat并打开模拟器,点击拨号器,在Logcat中找到拨号器的包名和类名即可。

隐式意图

要让一个Activity可以被隐式启动,那么要在清单文件中对跳转到的Activity(也就是TwoActivity)进行配置。在清单文件的activity节点中设置intent-filter子节点,并配置action和category。(如果不配置的话,只能被显式启动,如果配置了后,也可以被隐式启动)

    <activity
        android:name="com.example.TwoActivity" >
        <intent-filter >
            <action android:name="a.b.c"/>
            <data android:scheme="example"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>                                                  

o action 指定动作:可以自定义,可以使用系统自带的。
o data 指定数据:操作什么内容。操作数据的前缀必须是example
o category 类别:是为某一种类定义的,一般使用默认类别即可
隐式意图跳转至指定SecondActivity

     /**
     * 隐式启动SecondActivity
     */
    public void click3(View v){
        Intent intent = new Intent();
    //匹配action为a.b.c的Activity
        intent.setAction("a.b.c");
    //匹配scheme example是清单文件的前缀, 123是数据,可以自定义
    intent.setData(Uri.parse("example:123"));
        //如果没有设置Category的匹配,那么自动匹配CATEGORY_DEFAULT
//      intent.addCategory(Intent.CATEGORY_DEFAULT);
        startActivity(intent);
    }

备注:当启动Activity的时候,系统会在所有清单文件中寻找与我们创建的intent匹配的intent-filter,找到则启动,找不到则抛异常

隐式意图跳转至指定的系统中的Activity  
示例1:隐式跳转至打电话Activity
/**
 *  隐式跳转至打电话Activity
 */
public void click4(View v){
    //创建意图,这个是隐式意图
    Intent intent = new Intent();
    //设置动作
    intent.setAction(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:110"));
    //启动Activity
    startActivity(intent);
}

电话源码中的filter

    示例2:跳转拨号器界面
 /**
 * 隐式启动拨号器 
 */
public void click3(View v){
        Intent intent = new Intent();
    intent.setAction(Intent.ACTION_DIAL);
        intent.setData(Uri.parse("tel:76115230"));
    startActivity(intent);
}

如果在清单文件中定义data的时候,添加了android:mimeType,操作如下:

    <activity
        android:name="com.example.TwoActivity" >
        <intent-filter >
            <action android:name="a.b.c"/>
            <data android:scheme="example" android:mimeType="text/name"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

在代码中就需要指定mimeType

public void click5(View v){
    Intent intent = new Intent();
    intent.setAction("a.b.c");
    //匹配mimetype
//      intent.setType("text/name");
        //匹配scheme
//      intent.setData(Uri.parse("example:测试"));
        intent.setDataAndType(Uri.parse("example:测试"), "text/name");
        startActivity(intent);
    }

备注:setType和setData 不能共存,所以要使用共存的setDataAndType方法。

案例:跳转到浏览器怎么做呢?

/**
     * 显式跳转至浏览器
     */
    public void click6(View v){
        Intent intent = new Intent();
        intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");
        startActivity(intent);
    }
    /**
     * 隐式跳转至浏览器
     */
    public void click7(View v){
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }

当多个浏览器的时候,在显式的时候,直接启动了,只能启动一个浏览器;在隐式的时候,可以让选择。
应用场景
1、启动同一应用中的Activity,用显式
2、启动不同应用中的Activity,用隐式
显式启动效率高于隐式
如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择。比如:手机上安装多个浏览器时候。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓中可以使用 Intent 实现界面。具体步骤如下: 1. 创建一个 Intent 对象,并传入当前 Activity 和目标 Activity 的类名参数。 ```java Intent intent = new Intent(MainActivity.this, TargetActivity.class); ``` 2. 可以通过 putExtra() 方法向目标 Activity 传递数据。 ```java intent.putExtra("key", value); ``` 3. 调用 startActivity() 方法启动目标 Activity。 ```java startActivity(intent); ``` 完整代码示例: ```java // MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建 Intent 对象,传入当前 Activity 和目标 Activity 的类名 Intent intent = new Intent(MainActivity.this, TargetActivity.class); // 向目标 Activity 传递数据 intent.putExtra("name", "张三"); intent.putExtra("age", 20); // 启动目标 Activity startActivity(intent); } } // TargetActivity.java public class TargetActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); // 获取传递过来的数据 String name = getIntent().getStringExtra("name"); int age = getIntent().getIntExtra("age", 0); // 在界面上显示数据 TextView textView = findViewById(R.id.text_view); textView.setText("姓名:" + name + ",年龄:" + age); } } ``` 需要注意的是,需要在 AndroidManifest.xml 文件中注册目标 Activity,否则会出现 ActivityNotFoundException 异常。在 application 节点下添加如下代码: ```xml <activity android:name=".TargetActivity"></activity> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值