Android组件间通信:Intent的用法_android 组件 通讯

1.3.发出明确或隐含的意图

Android支持显式和隐式意图。应用程序可以在意图中直接定义目标组件(明确的意图)或者要求Android系统根据意向数据评估注册的组件(隐含意图 ).

Explicit意图使用Java类作为标识符,显式地定义Android系统应该调用的组件。显式意图通常在应用程序中使用,因为应用程序中的类由应用程序开发人员控制。下面展示了如何创建一个明确的意图并将其发送到Android系统以启动一个活动。

Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");

隐式意图指定应该执行的操作和提供操作内容的可选数据。如果一个隐含的意图被发送到Android系统,它将搜索为特定动作和拟合数据类型注册的所有组件。如果只找到一个组件,Android会直接启动这个组件。如果Android系统识别出多个组件,用户将得到一个选择对话框,并可以决定哪个组件应该用于目的。

例如,下面的命令告诉Android系统查看一个网页。所有已安装的web浏览器都应该通过意向过滤器注册到相应的意向数据中。

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.vogella.com/"));
startActivity(i);

1.4.确定有效的意向接收者

有时您需要确定组件是否已注册意向。例如,您希望检查某个意向接收器是否可用,如果某个组件可用,则在应用程序中启用一个功能。

可以通过PackageManager class
下面的示例代码检查组件是否注册了特定目的。构造您想要触发的意图,并将其传递给下面的方法。

public static boolean isIntentAvailable(Context ctx, Intent intent) {
    final PackageManager mgr = ctx.getPackageManager();
    List<ResolveInfo> list =
        mgr.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

根据结果你可以调整你的申请。例如,可以禁用或隐藏某些菜单项。

1.5.意图作为事件触发器

意图可以用来向Android系统发送广播消息广播接收机可以注册到事件,并在发送此类事件时收到通知。

您的应用程序可以注册到系统事件中,例如,新邮件已到达、系统启动完成或收到电话呼叫并做出相应反应。

2.活动之间的数据传输

2.1.数据传输到目标组件

意图包含某些头数据,例如所需的操作、类型等。可选地,意图还可以包含基于Bundle类,该类可以通过 getExtras()方法

也可以将数据直接添加到Bundle通过超载 putExtra()方法Intent object。附加项是键/值对。类型始终是字符串。作为值,可以使用基元数据类型(int ,float, …) plus类型的对象String ,Bundle ,Parcelable和可序列化 .

接收组件可以通过Intent object上的getAction ( )和getData ( )方法访问这些信息。这个Intentobject可以通过getIntent ( )方法进行检索。

接收意图的组件可以使用getIntent().getExtras()方法调用以获取额外数据。下面的代码片段演示了这一点。

Bundle extras = getIntent().getExtras();
if (extras == null) {
    return;
}
// get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {
    // do something with the data
}

2.2.从子活动中检索结果数据

活动可以通过手机上的后退按钮关闭。在这种情况下finish()方法被执行。如果活动是用startActivity(Intent)方法调用时,调用方不需要来自现在已关闭的活动的结果或反馈。

如果你用startActivityForResult()方法调用时,需要子活动提供反馈。子活动结束后onActivityResult()你可以根据结果调用sub actions。

在startActivityForResult()方法调用您可以指定一个结果代码来确定您启动了哪个活动。此结果代码将返回给您。已启动的活动还可以设置一个结果代码,调用者可以使用该代码来确定活动是否已取消。
子活动使用finish()方法来创建新的意图并将数据放入其中。它还通过setResult()方法调用

下面的示例代码演示如何触发意图和startActivityForResult()方法

public void onClick(View view) {
    Intent i = new Intent(this, ActivityTwo.class);
    i.putExtra("Value1", "This value one for ActivityTwo ");
    i.putExtra("Value2", "This value two ActivityTwo");
    // set the request code to any code you like,
    // you can identify the callback via this code
    startActivityForResult(i, REQUEST_CODE);
}

如果你使用startActivityForResult()方法,然后开始活动被称为子活动 .

如果子活动完成,它可以通过意图这是在finish()方法

@Override
public void finish() {
    // Prepare data intent
    Intent data = new Intent();
    data.putExtra("returnKey1", "Swinging on a star. ");
    data.putExtra("returnKey2", "You could be better then you are. ");
    // Activity finished ok, return the data
    setResult(RESULT_OK, data);
    super.finish();
}

子活动完成后onActivityResult()调用中的方法活动被称为

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
        if (data.hasExtra("returnKey1")) {
            Toast.makeText(this, data.getExtras().getString("returnKey1"),
                Toast.LENGTH_SHORT).show();
        }
    }
}

3.通过意向过滤器注册意向

意图是用来向Android系统发出某种事件已经发生的信号。意图通常描述应该执行的操作,并提供执行该操作的数据。例如,您的应用程序可以通过intent为某个URL启动浏览器组件。下面的例子说明了这一点。

String url = "https://www.vogella.com/";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

但是Android系统如何识别能够对某种意图做出反应的组件呢?

组件可以通过意向过滤器对于特定的操作和特定的数据。意图过滤器指定活动、服务或广播接收器可以通过声明组件的功能来响应的意图类型。
Android组件在 AndroidManifest.xml或者在广播接收器的情况下也可以通过代码动态地进行。它的数据由一个意图过滤器定义。它也可以包含额外的元数据。

如果一个意图被发送到Android系统,Android平台将运行一个接收器确定。它使用意图中包含的数据。如果多个组件注册了同一个意图过滤器,用户可以决定应该启动哪个组件。

您可以通过意向过滤器为某些事件注册Android组件。如果一个组件没有定义一个组件,它只能通过显式意图调用。本章提供了一个注册意图组件的示例。注册的关键是组件注册正确的操作、mime类型并指定正确的元数据。

如果您将这样的意图发送到您的系统,Android系统将为该意图确定所有注册的Android组件。如果已经为此目的注册了多个组件,则用户可以选择应该使用哪个组件。

3.1.示例:将活动注册为浏览器

以下代码将注册活动对于意图当有人想打开一个网页时会触发。

<activity android:name=".BrowserActivitiy"
          android:label="@string/app_name">
  <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT" />
     <data android:scheme="http"/>
  </intent-filter>
</activity>

3.2.示例:为共享意向注册活动

以下示例为注册活动ACTION_SEND意图。它声明自己只与文本/纯文本mime类型

<activity
    android:name=".ActivityTest"
    android:label="@string/app_name" >
    <intent-filter>
      <action android:name="android.intent.action.SEND" />

      <category android:name="android.intent.category.DEFAULT" />

      <data android:mimeType="text/plain" />

    </intent-filter>

</activity>

如果组件未定义意图过滤器,则只能通过显式意图调用它。

来自:https://www.vogella.com/tutorials/AndroidIntent/article.html#starting-activities-or-services

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值