Android基础#17:用于连接组件桥梁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中:
(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中: