android | activity中Intent

主要涉及两点,如何启动Activity;如何传递数据;

官方文档地址:地址链接

应用组件

应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相互依赖,但每个组件都以独立实体形式存在,并发挥特定作用 — 每个组件都是唯一的构建基块,有助于定义应用的总体行为。
共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。
以下便是这四种应用组件类型:

  1. Activity
    Activity表示具有用户界面的单一屏幕。例如,电子邮件应用可能具有一个显示新电子邮件列表的Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。 尽管这些Activity通过协作在电子邮件应用中形成了一种紧密结合的用户体验,但每一个 Activity 都独立于其他 Activity而存在。 因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。 例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。
  2. 服务(Service)
    服务是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面。 例如,当用户位于其他应用中时,服务可能在后台播放音乐或者通过网络获取数据,但不会阻断用户与Activity 的交互。 诸如 Activity 等其他组件可以启动服务,让其运行或与其绑定以便与其进行交互。
  3. 内容提供程序(ContentProvider)
    内容提供程序管理一组共享的应用数据。您可以将数据存储在文件系统、SQLite 数据库、网络上或您的应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供程序查询数据,甚至修改数据(如果内容提供程序允许)。 例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何具有适当权限的应用都可以查询内容提供程序的某一部分(如 ContactsContract.Data),以读取和写入有关特定人员的信息。
  4. 广播接收器(BroadcastReceiver)
    广播接收器是一种用于响应系统范围广播通知的组件。 许多广播都是由系统发起的 — 例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可以发起广播 — 例如,通知其他应用某些数据已下载至设备,并且可供其使用。 尽管广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。 但广播接收器更常见的用途只是作为通向其他组件的“通道”,设计用于执行极少量的工作。 例如,它可能会基于事件发起一项服务来执行某项工作。并且每条广播都作为Intent 对象进行传递。

Android 系统设计的独特之处在于,任何应用都可以启动其他应用的组件。
由于系统在单独的进程中运行每个应用,且其文件权限会限制对其他应用的访问,因此您的应用无法直接启动其他应用中的组件, 但 Android 系统却可以。因此,要想启动其他应用中的组件,您必须向系统传递一则消息,说明您想启动特定组件的 Intent。 系统随后便会为您启动该组件。

启动组件

四种组件类型中的三种 — Activity、服务和广播接收器 — 通过名为 Intent的异步消息进行启动。Intent会在运行时将各个组件相互绑定(您可以将Intent 视为从其他组件请求操作的信使),无论组件属于您的应用还是其他应用。

Intent使用Intent 对象创建,它定义的消息用于启动特定组件或特定类型的组件 — Intent可以是显式的,也可以是隐式的。
每种类型的组件有不同的启动方法:

  • 您可以通过将Intent 传递到 startActivity()startActivityForResult()(当您想让 Activity返回结果时)来启动 Activity(或为其安排新任务)。
  • 您可以通过将 Intent 传递到startService()来启动服务(或对执行中的服务下达新指令)。 或者,您也可以通过将 Intent 传递到bindService()来绑定到该服务。
  • 您可以通过将 Intent 传递到sendBroadcast()sendOrderedBroadcast()sendStickyBroadcast() 等方法来发起广播;
  • 您可以通过在ContentResolver 上调用 query() 来对内容提供程序执行查询。

Intent

文档地址:地址
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:

  • 启动 Activity
    Activity 表示应用中的一个屏幕。通过将Intent传递给 startActivity(),您可以启动新的Activity 实例。Intent 描述了要启动的Activity,并携带了任何必要的数据。
    如果您希望在Activity 完成后收到结果,请调用startActivityForResult()。在 Activity 的 onActivityResult()回调中,您的 Activity将结果作为单独的Intent对象接收。如需了解详细信息,请参阅Activity 指南。

  • 启动服务
    Service 是一个不使用用户界面而在后台执行操作的组件。通过将Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent描述了要启动的服务,并携带了任何必要的数据。
    如果服务旨在使用客户端-服务器接口,则通过将Intent 传递给bindService(),您可以从其他组件绑定到此服务。如需了解详细信息,请参阅服务指南。

  • 传递广播
    广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()sendOrderedBroadcast()sendStickyBroadcast(),您可以将广播传递给其他应用。

Intent 对象携带了Android 系统用来确定要启动哪个组件的信息(例如,准确的组件名称或应当接收该Intent 的组件类别),以及收件人组件为了正确执行操作而使用的信息(例如,要采取的操作以及要处理的数据)。

Activity之间传递数据,就涉及一个对象Intent,它包含了一组信息:

  • Component name(要启动的组件名称。);
  • Action(指定要执行的通用操作(例如,“查看”或“选取”)的字符串。);
  • Data(引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。);
  • Category(一个包含应处理 Intent 组件类型的附加信息的字符串。);
  • Extras(携带完成请求操作所需的附加信息的键值对。);
  • Flags(在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity,以及启动之后如何处理);

案例一:启动同一应用Activity

MainActivity.java

package com.weizu.intent;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent();
                intent.putExtra("text", "这是传递的数据");
                intent.setClass(MainActivity.this, OtherActivity.class);
                MainActivity.this.startActivity(intent);
            }
        });
    }
}

OtherActivity.java

package com.weizu.intent;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class OtherActivity extends Activity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_other);

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();

        textView = (TextView)findViewById(R.id.text);
        textView.setText((String)bundle.get("text"));

    }
}

对应的layout布局文件,res/layout/activity_main.xml

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn"
        android:text="@string/btn"
        />

activity_other.xml

<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/other" />

当然,引用的values字符串定义新增如下:
values/string.xml

<string name="other">Other Activity</string>
<string name="btn">Go</string>

最后,在资源配置文件中需要声明我们新建的Activity
AndroidManifest.xml

<activity
            android:name="com.weizu.intent.OtherActivity"
            android:label="@string/other" />

下面展示一下案例的效果:

当然了,既然有启动同一应用的Activity,那么也就有:

案例二:启动不同应用Activity

MainActivity.java

package com.weizu.intent;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Uri uri = Uri.parse("smsto://329544235");
                Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
                intent.putExtra("sms_body", "这是发送的数据");
                MainActivity.this.startActivity(intent);
            }
        });
    }
}

效果展示:


   Reprint policy


《android | activity中Intent》 by 无涯明月 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
android | `Activity`生命周期 android | `Activity`生命周期
还是上一节的文档中,我们找到Activity部分的介绍,这里给出地址选择部分摘要。 简介Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都
2019-08-09
Next 
flutter开发 | 二 flutter开发 | 二
安装完成了,然后找了找教程。看见了这样一句话:Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到F
2019-08-04
  TOC