掌握Android Intent与IntentFilter的艺术-深入探索匹配规则与实践技巧


引言

在Android开发的世界中,Intent和IntentFilter是实现组件间通信和任务调度的关键。它们不仅关系到应用的互操作性,还直接影响用户体验。本文将深入探讨Intent和IntentFilter的匹配规则,并通过实际代码示例,揭示如何高效利用这些规则来提升应用的功能性和灵活性。


内容概括
  1. Intent的概念与作用:介绍Intent作为消息传递对象的基本功能,以及如何通过它启动Activity、Service和BroadcastReceiver。
  2. Intent携带的信息:详细说明Intent可以携带的组件名称、操作、数据、类别、附加数据和标志位等信息。
  3. Intent的类型:区分显式Intent和隐式Intent,并重点讨论隐式Intent的应用场景。
  4. IntentFilter的匹配规则:深入分析action、category和data三种过滤信息的匹配规则,并提供实际的XML配置示例。
  5. 实践技巧与注意事项:分享如何验证Intent是否可处理,以及在没有匹配Intent时的应对策略。

一、Intent的概念与作用


在Android开发中,Intent 是一种消息传递对象,它用于在应用组件之间传递消息和启动行为。Intent机制是Android系统中实现组件间通信和任务调度的核心。以下是Intent的基本概念和作用的详细说明:


1、基本概念

Intent主要包含以下几部分:

  • 组件名称(Component Name):指定要启动的组件的名称,如Activity、Service或BroadcastReceiver的类名。

  • 操作(Action):定义Intent要执行的动作,例如ACTION_VIEWACTION_EDIT等,操作可以是系统预定义的,也可以是开发者自定义的。

  • 数据(Data):提供Intent要操作的数据,通常是URI,表示数据的位置。

  • 类别(Category):描述Intent的分类,如CATEGORY_LAUNCHER表示这是一个启动Activity的Intent,用于应用的入口。

  • 附加数据(Extras):携带额外的信息,以键值对的形式存在,可以通过putExtra()方法添加。

  • 标志位(Flags):提供额外的标志信息,指示系统如何启动Activity,例如FLAG_ACTIVITY_NEW_TASK


2、Intent的作用

Intent的作用主要体现在以下几个方面:

  • 启动组件:通过Intent可以启动一个新的Activity、Service或BroadcastReceiver,实现组件的激活和任务的开始。

  • 数据传递:Intent可以携带数据,这些数据可以在启动的组件间传递,实现信息的共享。

  • 隐式调用:使用隐式Intent时,Android系统会根据Intent中定义的操作和数据类型,查找并启动能够处理该Intent的应用组件。

  • 组件解耦:通过Intent机制,组件间的调用不必知道对方具体的实现细节,只需要知道Intent的描述即可,这有助于降低组件间的耦合度。

  • 系统服务调用:Intent还可以用来与系统服务进行交互,如发送邮件、拨打电话等。


3、示例

以下是一些启动不同组件的Intent使用示例:

  • 启动Activity

    Intent intent = new Intent(this, TargetActivity.class);
    startActivity(intent);
    
  • 启动Service

    Intent serviceIntent = new Intent(this, MyService.class);
    startService(serviceIntent);
    
  • 发送广播

    Intent broadcastIntent = new Intent("com.example.MY_CUSTOM_ACTION");
    sendBroadcast(broadcastIntent);
    

通过这些示例,我们可以看到Intent在Android应用开发中扮演着至关重要的角色,它不仅简化了组件间的通信,还提高了应用的灵活性和扩展性。


二、Intent携带的信息


Intent作为Android中用于组件间通信的桥梁,可以携带多种信息,这些信息共同构成了Intent的“意图”,指导系统如何响应和处理这个Intent。以下是Intent可以携带的主要信息类型:


1、组件名称(Component Name)

组件名称指定了Intent要启动的组件的确切类名。如果指定了组件名称,Intent就是显式的,系统将直接启动该组件。如果不指定,Intent则为隐式,系统需要根据其他信息(如操作和数据)来寻找合适的组件。

Intent intent = new Intent(this, SpecificActivity.class);

2、操作(Action)

操作定义了Intent要执行的动作。系统提供了一些标准的action,如ACTION_VIEWACTION_SEND等,开发者也可以定义自己的action。

intent.setAction(Intent.ACTION_SEND);

3、数据(Data)

数据提供了Intent要操作的具体内容,通常是一个URI。它可以指定一个文件路径、网络资源或其他数据源。

Uri uri = Uri.parse("mailto:test@example.com");
intent.setData(uri);

4、类别(Category)

类别描述了Intent的附加性质,它可以用来进一步细化Intent的匹配条件。例如,CATEGORY_LAUNCHER通常用于定义Activity作为应用的入口。

intent.addCategory(Intent.CATEGORY_LAUNCHER);

5、附加数据(Extras)

附加数据是Intent中携带的额外信息,以键值对的形式存在。这些信息可以是字符串、整数、浮点数、布尔值等,也可以是复杂的对象,如Parcelable和Serializable。

intent.putExtra("key", "value");

6、标志位(Flags)

标志位为Intent提供了额外的控制选项,指示系统如何启动Activity或处理Intent。例如,使用FLAG_ACTIVITY_NEW_TASK可以启动一个新的任务栈。

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

三、Intent的类型


在Android系统中,Intent主要分为两大类:显式Intent(Explicit Intent)和隐式Intent(Implicit Intent)。这两类Intent在应用组件间的通信和任务调度中扮演着不同的角色。


1、显式Intent

显式Intent是直接指向特定应用组件的Intent。使用显式Intent时,你需要明确指定要启动的组件的类名。这种方式通常用于应用内部组件之间的调用,例如从一个Activity跳转到另一个Activity。

特点

  • 明确指定目标组件。
  • 不需要在AndroidManifest.xml中定义IntentFilter。
  • 通常用于应用内部的组件通信。

示例

Intent explicitIntent = new Intent(this, ExplicitActivity.class);
startActivity(explicitIntent);

2、隐式Intent

隐式Intent不指定具体的目标组件,而是通过定义动作(Action)、数据(Data)和类别(Category)等信息,让系统根据这些信息去寻找合适的组件来处理。这种方式常用于跨应用的组件调用,如发送邮件、拨打电话等。

特点

  • 不直接指定目标组件。

  • 需要在AndroidManifest.xml中定义IntentFilter,以便系统匹配。

  • 常用于启动系统范围内的通用操作。


(1)、隐式Intent调用示例

Intent implicitIntent = new Intent(Intent.ACTION_VIEW);
implicitIntent.setData(Uri.parse("http://www.example.com"));
startActivity(implicitIntent);

在这个例子中,Intent的Action是ACTION_VIEW,数据是某个网址的URI。系统会查找能够处理网页查看操作的组件(通常是浏览器)来响应这个Intent。


(2)、匹配Intent信息的IntentFilter示例:

在AndroidManifest.xml中,我们可以通过定义IntentFilter来声明组件能够处理的Intent类型。系统会根据IntentFilter中的action、category和data与发送的Intent进行匹配,以确定是否启动对应的组件。

<activity android:name=".YourActivity"><intent-filter><action android:name="android.intent.action.SEND"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="text/plain"/></intent-filter>
</activity>

在这个XML示例中,定义了一个IntentFilter,它声明了YourActivity可以处理包含ACTION_SEND操作、默认类别以及文本类型数据的Intent。


(3)、Intent的携带信息示例:

下面是一个Intent携带信息的完整示例,它演示了如何构建一个发送邮件的Intent:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain"); // 设置MIME类型
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"test@example.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject Line");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hello, how are you?");

在这个例子中,我们构建了一个用于发送邮件的Intent,指定了邮件的类型、收件人、主题和正文内容。


(4)、Intent的匹配过程

当发送一个隐式Intent时,Android系统会进行以下步骤来查找合适的组件:

  1. 查找IntentFilter:系统会在安装在设备上的所有应用的AndroidManifest.xml中查找匹配的IntentFilter。
  2. 匹配Action:检查Intent中定义的Action是否与IntentFilter中的Action相匹配。
  3. 匹配Category:检查Intent中定义的Category是否与IntentFilter中的Category完全一致。
  4. 匹配Data:检查Intent中定义的Data是否与IntentFilter中的Data相匹配。

如果找到一个或多个组件能够处理这个Intent,系统会将Intent传递给这些组件中的第一个(或者通过用户选择的组件)。如果没有找到任何匹配的组件,Intent的发送将会失败。


(5)、发送隐式Intent注意事项

在发送隐式Intent前,应调用resolveActivity()方法验证是否有可用的应用可以处理该Intent。这可以防止应用因找不到合适的组件而崩溃。

以下是使用隐式Intent发送短信的示例代码:

Uri uri = Uri.parse("smsto:18789999999");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(uri);
intent.putExtra("sms_body", "Hello");
if (intent.resolveActivity(getPackageManager()) != null) {startActivity(intent);
}

3、显式Intent与隐式Intent的选择


选择使用显式Intent还是隐式Intent取决于你的具体需求:

  • 当你需要直接与应用内部的组件交互,或者调用的组件是已知的,使用显式Intent。
  • 当你需要执行一个通用操作,而这个操作可以由多种应用来完成,或者你希望让用户选择使用哪个应用来完成操作,使用隐式Intent。

合理使用这两种Intent类型,可以帮助你构建更加灵活和互操作性更强的Android应用。


四、IntentFilter的匹配规则


IntentFilter是Android中用于定义一个组件(通常是Activity)能够响应的Intent类型的机制。系统使用IntentFilter来确定当发送一个隐式Intent时,哪个组件应该被启动。IntentFilter可以包含动作(action)、类别(category)和数据(data)三种类型的信息,它们的匹配规则如下:


1、动作(Action)的匹配规则

动作是Intent的一个基本属性,定义了要执行的操作。在IntentFilter中,可以指定一个或多个动作,系统在匹配时会检查发送的Intent中是否包含这些动作中的至少一个。如果发送的Intent中的动作与IntentFilter中的任何一个动作匹配,那么这个IntentFilter就是有效的。

<intent-filter><action android:name="android.intent.action.VIEW" /><action android:name="android.intent.action.EDIT" /><!-- 更多动作 -->
</intent-filter>

在Android中,android.intent.action是定义了一系列标准操作的Intent actions的授权名称空间。这些预定义的actions使得开发者可以执行常见的任务,而无需定义自己的操作。


以下是一些常用的android.intent.action及其作用的详细说明:

  • MAIN - 用于启动一个新的Activity,通常作为应用的入口点。当用户点击应用图标时,通常就是通过这个action启动的。
Intent intent = new Intent(Intent.ACTION_MAIN);
  • VIEW - 用于打开一个URI,比如一个网页链接或者是一个联系人的详情。系统会根据URI的类型打开相应的应用。
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
  • SEND - 用于发送数据,如文本或文件,到另一个应用。经常与EXTRA_TEXTEXTRA_STREAM等extras一起使用。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Hello World");
  • SENDTO - 用于发送到某个特定的URI,如发送短信或邮件。
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:test@example.com"));
  • EDIT - 用于编辑给定的数据,比如编辑一个联系人的信息。
Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse("content://contacts/people/1"));
  • CALL- 用于直接拨打一个电话号码。
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:1234567890"));
  • DIAL用于打开拨号界面并填入电话号码,但不会自动拨打。
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:1234567890"));
  • ANSWER - 用于接听电话。
Intent intent = new Intent(Intent.ACTION_ANSWER);
  • INSERT - 用于插入数据,如添加日历事件或联系人。

  • DELETE - 用于删除数据,如删除短信或通话记录。

  • PICK - 用于从数据选择器中选择一个数据项,如选择一个联系人。

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
  • GET_CONTENT - 类似于ACTION_PICK,但更通用,用于选择或返回数据。
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
  • SEARCH - 用于启动一个搜索,通常与一个搜索框的点击事件相关联。
Intent intent = new Intent(Intent.ACTION_SEARCH);
  • WEB_SEARCH - 用于启动一个网页搜索。
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
  • TIME_TICK - 用于响应系统时间的滴答,通常由BroadcastReceiver处理。

  • HEADSET_PLUG - 用于响应耳机插拔事件。

  • BATTERY_CHANGED - 用于响应电池电量变化。

  • SCREEN_ONSCREEN_OFF - 分别用于响应屏幕打开和关闭事件。

  • BOOT_COMPLETED - 系统启动完成后触发的事件。

这些actions是Android Intent系统的一部分,它们允许应用以一种标准化的方式进行交互。使用这些预定义的actions,开发者可以构建出能够与其他应用协同工作的应用程序,同时为用户提供一致的体验。


2、类别(Category)的匹配规则

类别提供了额外的语义信息,用于进一步指定Intent的上下文。一个Intent可以包含多个类别,但要匹配IntentFilterIntent中的所有类别都必须与IntentFilter声明的类别完全匹配。对于隐式Intent,即使没有在代码中明确指定类别,Android系统也会自动添加CATEGORY_DEFAULT类别。


<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><!-- 更多类别 -->
</intent-filter>

在Android中,android.intent.category是定义了一系列标准类别的Intent categories的授权名称空间。这些预定义的categories用于Intent中,以提供额外的上下文信息,帮助系统确定如何正确地处理Intent。


以下是一些常用的android.intent.category及其作用的详细说明:

  • DEFAULT - 这是最常用的类别,适用于大多数隐式Intent。系统会自动为startActivity()startActivityForResult()方法添加这个类别。
intent.addCategory(Intent.CATEGORY_DEFAULT);
  • HOME - 用于定义启动应用的主屏幕的Intent。
intent.addCategory(Intent.CATEGORY_HOME);
  • BROWSABLE - 用于定义可以处理网页或网络数据的Intent,通常与VIEW动作一起使用。
intent.addCategory(Intent.CATEGORY_BROWSABLE);
  • ALTERNATIVE - 用于定义作为其他Intent的替代方案的Intent。当发送一个带有ALTERNATIVE类别的Intent时,系统可能会提供选择界面让用户选择使用哪个应用。
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
  • SELECTED_ALTERNATIVE - 与ALTERNATIVE类似,但用于用户已经选择了一个替代方案之后。

  • TAB - 用于定义启动一个新的tab页的Intent,通常用于浏览器或其他多标签的应用。

  • LEANBACK_LAUNCHER - 用于启动应用的leanback(电视界面)版本的主Activity。

  • LEANBACK_SETTINGS - 用于启动应用的leanback设置界面。

  • INFO - 用于定义显示特定信息的Intent,如应用详情。

  • PREFERENCE - 用于启动应用的设置界面。

  • LAUNCHER - 用于定义启动应用的特定组件,如启动Activity。

  • TEST - 用于定义测试Intent,通常用于应用的单元测试或调试。

  • SECONDARY - 用于定义非主要的Intent,可能用于辅助功能或次要操作。

  • CAR_MODE - 用于定义在汽车模式下启动的Intent。

  • DESK_MODE - 用于定义在桌面模式下启动的Intent。

  • DOCK_MODE - 用于定义在停靠模式下启动的Intent,通常用于手机连接到桌面底座时。

  • HOME_MAIN - 用于定义启动设备主屏幕的Intent。

  • APP_LAUNCHER - 用于定义启动应用的Intent。

  • APP_MARKET - 用于定义启动应用市场的Intent。


这些categories在构建Intent时非常有用,它们帮助系统理解Intent的上下文,并找到最合适的应用组件来处理它。例如,如果你发送一个带有BROWSABLE类别的VIEW Intent,系统会知道它需要找到一个可以显示网页的应用。


使用这些预定义的categories,开发者可以确保他们的应用以一种符合用户期望和系统行为的方式来响应Intent。同时,它们也提供了一种标准化的方法来描述应用的行为和功能,从而提高应用的互操作性和用户体验。


3、数据(Data)的匹配规则

数据用于指定Intent可以操作的数据类型和格式。IntentFilter中的数据部分可以定义多种数据类型,包括MIME类型和URI模式。发送的Intent中的数据必须与IntentFilter中的至少一个数据匹配。


数据部分可以包括:

  • scheme(协议):如httphttpsfile等。
  • host(主机):如example.com
  • port(端口):如80
  • path(路径):如/search
<intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="http"android:host="example.com" /><data android:scheme="https"android:host="api.example.com"android:pathPrefix="/search" /><!-- 更多数据 -->
</intent-filter>

在这个例子中,第一个<data>元素匹配所有http://example.com/的URI,而第二个匹配所有以https://api.example.com/search开始的URI。


4、匹配规则的总结

  • 动作匹配Intent中必须包含IntentFilter中声明的至少一个动作。
  • 类别匹配Intent中的所有类别必须与IntentFilter中的类别完全一致。
  • 数据匹配Intent中的数据必须与IntentFilter中的至少一个数据匹配。

假设我们有一个网页浏览器应用,我们希望当用户尝试打开一个httphttps协议的网页时,我们的应用能够被系统选中。我们可以在AndroidManifest.xml中为相应的Activity定义如下IntentFilter

<activity android:name=".BrowserActivity"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="http" /><data android:scheme="https" /></intent-filter>
</activity>

当用户点击一个网页链接时,系统会查找所有能够响应VIEW动作和BROWSABLE类别的组件,并且检查它们的<data>元素是否匹配链接的协议。在这个例子中,我们的BrowserActivity将能够响应所有httphttps协议的网页链接。

通过合理配置IntentFilter,开发者可以控制其应用组件如何响应来自其他应用或系统的隐式Intent,从而提高应用的可见性和互操作性。


五、最佳实践技巧


在Android开发中,合理使用Intent和IntentFilter对于实现组件间通信和应用的互操作性至关重要。以下是一些最佳实践技巧及注意事项的详细说明:


1、最佳实践

  • 明确Intent的使用场景

    • 使用显式Intent进行应用内部组件的调用。

    • 使用隐式Intent实现跨应用的组件调用,如分享、发送邮件等。


  • 合理配置IntentFilter

    • 为需要接收隐式Intent的组件(如Activity)在AndroidManifest.xml中配置IntentFilter。

    • 确保IntentFilter中的action、category和data能够准确描述组件能够处理的Intent类型。


  • 使用MIME类型

    • 当处理特定类型的数据时,使用MIME类型来指定数据类型,如image/*text/plain

  • 检查Intent是否可处理

    • 在发送隐式Intent之前,使用resolveActivity()检查是否有可用的应用可以处理该Intent,避免应用崩溃。

  • 避免硬编码组件名称

    • 尽量使用隐式Intent而不是显式Intent,以便用户可以在多个应用中选择。

  • 使用Intent.FLAG_ACTIVITY_NEW_TASK

    • 当需要启动一个新的任务栈时,使用这个标志位,但要注意这可能会影响应用的返回栈。

  • 使用Extras传递数据

    • 使用putExtra()传递额外的数据,而不是将数据直接编码在URI中。

  • 处理数据URI的安全性

    • 对于从Intent中获取的数据URI,进行严格的安全检查,避免潜在的安全风险。

  • 考虑使用Action常量

    • 使用系统定义的标准Action常量,如ACTION_VIEWACTION_SEND等,而不是自定义Action。

  • 测试IntentFilter匹配
    • 在开发过程中,确保测试所有可能的Intent组合,以验证IntentFilter是否按预期工作。

2、注意事项


  • 避免Intent滥

    • 不要使用Intent进行重量级的数据传输,它更适合轻量级的消息传递。

  • 考虑用户隐私

    • 当处理敏感数据时,确保遵守用户隐私和数据保护的相关法规。

  • 处理Intent冲突

    • 当多个应用可以处理同一个Intent时,系统可能会显示一个选择器供用户选择,这可能会影响用户体验。

  • 避免泄露敏感信息

    • 在Intent中传递敏感信息时要小心,避免通过Intent泄露用户的私人数据。

  • 使用正确的MIME类型

    • 确保使用的MIME类型与数据类型匹配,错误的MIME类型可能会导致Intent不匹配。

  • 避免启动未定义的Activity

    • 在发送隐式Intent时,如果系统中没有应用可以处理该Intent,可能会导致应用崩溃。

  • 考虑设备和系统版本差异

    • 不同的设备和Android版本可能对Intent和IntentFilter的处理方式不同,进行充分的测试。

  • 避免过度依赖隐式Intent

    • 过度依赖隐式Intent可能会使应用的控制流程变得复杂,难以维护。

  • 处理Permission问题
    • 某些Intent可能需要特定的权限,确保你的应用具有必要的权限,或者在需要时请求用户授权。

通过遵循这些最佳实践和注意事项,你可以更有效地使用Intent和IntentFilter,创建出互操作性强、用户体验良好的Android应用。


结语:

虽然我们已经了解了Intent和IntentFilter的强大功能和匹配规则,但在实际开发中,如何更智能地利用这些规则来提升应用的用户体验和互操作性,仍是一个值得深入探讨的话题。在未来的文章中,我们将进一步探索如何通过Intent和IntentFilter实现更高级的组件通信和任务调度策略。敬请期待!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【声呐仿真】学习记录3-待续

【声呐仿真】学习记录3-后续 第五阶段-获取数据1.运行赫尔库勒斯沉船的世界&#xff1a;2.键盘操纵rov至合适的位置&#xff0c;调整Image topic&#xff0c;查看输出图像3.RVIZ SONAR 图像查看器插件&#xff08;没有对应的topic&#xff09;4.点云5.录制rosbag 第六阶段-查看…

Unity学习笔记---物理引擎

RigidBody 刚体 1&#xff0c;Gravity Scale 重力参数&#xff0c;是一个乘量参数&#xff0c;调整为0则不受重力影响。 2&#xff0c;Sleeping Mode 睡眠模式&#xff0c;分为永不睡眠/开始时睡眠/开始时不睡眠3种。如需要一直碰撞检测可以选择永不睡眠。 BoxCollider 碰撞…

守护数据安全:精选七款数据加密软件

在数字化日益普及的今天&#xff0c;数据安全成为了企业和个人不可忽视的重要问题。加密软件作为数据安全的第一道防线&#xff0c;扮演着至关重要的角色。本文将为读者精选七款优秀的加密软件&#xff0c;帮助大家更好地守护数据安全。 Ping32数据加密软件 Ping32数据加密软…

Timestamp Unix时间戳在线转换

Timestamp Unix时间戳在线转换 打开网站 在线工具网-梦幻加菲猫 选择“时间戳转换” 在前半部分输入框输入时间/时间戳&#xff0c;点击“转换>>”按钮&#xff0c;即可转换完成 得到转换结果

getter和setter方法的优缺点

Getter和Setter方法&#xff0c;在计算机编程中常被用来访问和修改对象的内部状态。下面让我们来看看它们各自的优缺点吧~ Getter方法的优点&#xff1a; 1. 封装性&#xff1a;Getter方法能够隐藏对象的内部状态&#xff0c;只对外提供必要的访问接口&#xff0c;这样可以防止…

Python自动化SQL注入和数据库取证工具库之sqlmap使用详解

概要 在网络安全领域,SQL注入仍然是最常见的攻击之一。sqlmap是一个开源的自动化SQL注入和数据库取证工具,它提供了广泛的功能来检测和利用SQL注入漏洞。本文将详细介绍sqlmap的安装、特性、基本与高级功能,并结合实际应用场景,展示其在网络安全测试中的应用。 安装 sqlm…

银行监管报送系统系列介绍(十七):一表通2.0

国家金融监督管理总局于9月发布了【一表通2.0&#xff08;试用版&#xff09;】&#xff08;简称&#xff1a;一表通2.0&#xff09;&#xff0c;在原试点报送范围的基础上扩大了试点报送区域&#xff0c;意味着将陆续扩大试报送机构范围&#xff0c;推进的速度已明显加快。尽早…

HQChart使用教程98-右键菜单2.0使用介绍

HQChart使用教程98-右键菜单2.0使用介绍 内置右键菜单启用右键菜单定制右键菜单内容1. 注册内置右键菜单创建回调事件2. 修改内置菜单的显示内容回调函数格式菜单数据结构示例 3. 注册菜单项点击事件回调 右键事件完整示例HQChart代码地址 内置右键菜单 HQChart h5版本内置提供…

Spring Boot + Mybatis-plus代码生成器 自动生成项目结构

首先创建一个新的springboot项目 项目初始化结构如下&#xff1a; 运行自动生成结构代码后的效果如下&#xff1a; 对比初始化项目结构可以发现结构中多了以下几个部分; controller文件夹存储接口类mapper文佳夹存储数据库映射model文件夹存储数据库模型类Service文件夹存储业…

未授权访问:Docker未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、通过crontab反弹宿主机shell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好…

LabVIEW

LabVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是由美国国家仪器&#xff08;National Instruments&#xff0c;简称NI&#xff09;公司开发的一种程序开发环境&#xff0c;它主要用于数据采集、仪器控制、测试和测量等应用。LabVIEW的最…

中文环境下编写sql server存储过程用中文命名的好处

在中文环境下编写SQL Server存储过程用中文命名的好处 随着信息技术的发展和编程语言对多语言字符集的支持增强&#xff0c;越来越多的开发者在中文环境下编写SQL Server存储过程时&#xff0c;开始使用中文命名。本文将讨论在这种情况下使用中文命名的诸多好处。 1. 提高可读…

万字长文带你掌握 IDEA 2024 的30个Debug调试绝技,让你开发与修复 Bug 的效率提升亿倍

万字长文带你掌握 IDEA 2024 的30个Debug调试绝技&#xff0c;让你开发与修复 Bug 的效率提升亿倍 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — …

QCC---Aptx Lossless验证

因为aptx Lossless属于高通骁龙声音的一部分&#xff0c;一般支持高通骁龙声音的设备会支持到&#xff0c;比如说手机&#xff0c;而且还要支持最新的aptx adaptive协议R2.2版本。但是如果手上没有这样的手机的话&#xff0c;有source芯片也可以去做测试验证。在最新的784.1版本…

Dockfile和YAML文件的区别

Dockerfile和YAML文件是两种不同格式的配置文件&#xff0c;它们在Docker生态系统中扮演不同的角色&#xff1a; Dockerfile&#xff1a;这是一个文本文件&#xff0c;用于通过一系列的指令定义一个Docker镜像的内容和构建过程。Dockerfile中的每一行通常对应一个Docker镜像层&…

入职Java,不会git被开除了。。。

入职Java&#xff0c;不会git被开除了。。。 文章目录 入职Java&#xff0c;不会git被开除了。。。前言一、Git是什么&#xff1f;二、Git的核心概念三、Git的工作流程四、Git的常用命令五、总结 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博…

钽酸锂集成光子芯片:引领光电集成新纪元

在信息技术飞速发展的今天&#xff0c;光电集成技术已成为推动全球集成电路产业持续创新的重要力量。随着全球集成电路产业发展步入“后摩尔时代”&#xff0c;芯片性能提升的难度和成本不断攀升&#xff0c;业界急需寻找新的技术突破口。在这一背景下&#xff0c;中国科学院上…

stream 排序

stream常用写法 // 实体类 public static class User {private String id;private String name;private String value;private String year; }1.List转Map List<User> list = userMapper.selectAll(param); List 转 MapMap<String, String> idMap = list.stream(…

微软发布研究报告:75%的知识工作者在工作中使用AI

“人工智能正在使整个劳动力的专业知识民主化&#xff0c;我们的最新研究强调了每个组织都有机会应用这项技术来推动更好的决策、协作&#xff0c;并最终实现业务成果。” ——Microsoft董事长兼首席执行官萨蒂亚纳德拉&#xff08;Satya Nadella&#xff09; 一年前&#xff0…

pycharm连接远程服务器,解决终端出现乱码问题

在终端输入命令时会有乱码问题&#xff0c;是字体编码设置错误。 根据上述步骤&#xff0c;设置完成后重启就可以了。