Android基础#17:用于连接组件桥梁Intent的使用

本文详细介绍了Android系统中Intent的概念及其使用方法。Intent作为一种重要的组件间通信机制,可用于活动、服务及广播接收器之间的交互。文章通过实例展示了如何使用Intent在不同组件间进行数据传递和控制流程。

    组件之间该如何进行切换?-----箴言-----

内容简介:

在Android系统中,应用程序的3个核心组件(活动、服务和广播接收器) 都是通过Intent来激活的。
或者说,当这些组件中的一个组件向另外一个组件转换的时候,就可以通过Intent来实现。

本篇介绍Intent相关概念和使用方法。
 

什么是Intent?
Intent最简单最常用的作用就是用于界面的切换。
Intent描述了组件想做什么

Intent(意图) 本身是一个包含被执行操作抽象描述的被动的数据结构。
Intent 在 Android 的官方 API 文档中是这样描述的:It is a passive data structure holding an abstract description of an operation to be performed. 它是一种数据结构,抽象描述一次将要被执行的操作,其作用是在程序运行过程中连接两个不同的组件。
从某种意义上说,Intent也是一种事件处理机制,在Android系统中,这里的事件被称为Intent(意图)。

Intent的数据结构:
Intent 对象通常使用六个主要组成部分来抽象描述的请求信息,它们是组件名称,行为,数据 / 数据类型,类别,附加信息和标示位:

Intent 对象使用组件名称描述传递消息的目标组件。这种明确指定目标组件名称的 Intent 称之为显式 Intent,系统会将显式 Intent 直接发送给目标组件。由于显式 Intent 需要指定目标组件,所以其更多的使用在应用内部组件间消息的传递。

传递Intent的几种场景:
在Android系统中, 存在如下几种不同的机制来传送Intent到每种组件中:
(1) 一个Intent对象传递给Context startActivity() 或Activty.startActivityForResult()以启动一个活动,
或者让一个存在的活动去做某些新的事情。
(2) 一个Intent对象是传递给Conext.startService() 来发起一个服务或者递交新的指令给运行中的服务。
可以发起这个服务。
(3) 一个Intent对象可以传递给任意广播方法,所有对此感兴趣的广播接收者都可以处理该Intent。

Intent的过滤:
Intent Filter(Intent过滤器)可以进行Intent的过滤。
Intent Filter描述了组件能处理什么事情。通过解析Intent可以进行组件间的切换。

使用Intent Filter有如下两个好处。
(1) Activities仅发出一个Intent请求, 便能重用其他组件的功能;
(2) Activities可以随时被替换为有等价Intent Filter的新Activity。

 

Intent使用举例:

(1)Activity之间的跳转:

startActivity(new Intent(MainActivity.this, NextActivity.class));

(2)Activity启动Service:

在MainActivity中:

Intent  intent = new Intent("com.example.apptest.START_SERVICE");
startService(intent);

MyService.java的实现:

package com.example.apptest;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;


public class MyService extends Service {
    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"------> onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "------>onDestory");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "------>onBind:" + intent);
        return null;
    }


}

在AndroidManifest.xml中:
 

<service android:name=".MyService">
        <intent-filter>
            <action android:name="com.example.apptest.START_SERVICE" />
        </intent-filter>
</service>

(3)Activity发送广播:

在MainActivity中:

private void sendCast() {
        Intent intent = new android.content.Intent("MyApp.SEND_ACTION");
        intent.putExtra("data",123);
        sendBroadcast(intent);
}

广播接收器MyBroadcastReceiver.java的实现:
 

package com.example.apptest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;


class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "MyBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int data = extras.getInt("data");
            // 处理data数据
            Log.i(TAG, "MyBroadcastReceiver==data=" + data);
        }
    }
}

在AndroidManifest.xml中:
 

<receiver android:name="MyBroadcastReceiver">
            <intent-filter>
                <action android:name="MyApp.SEND_ACTION" />
            </intent-filter>
</receiver>

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值