Intent是什么?

翻译为:意图,目的(名词)

其实根本没必要管它是什么,看看它能做什么就好了。

不过后来我知道了,它就是个机制----通信机制-----android的许多组件间的交流要依赖它。

下面说一些例子:

一、连接活动

例子的思路很简单:从一个组件跳转到另外一个组件

1. 组件=UI组件+类组件 ,即,需要一个.java文件,还需要一个layout文件

2. 用组件就要注册,在AndroidManifest.xml文件中加入代码就是了

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是第一个活动" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:text="导航到第二个activity" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements OnClickListener
{

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

        btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);

    }
    @Override
    public void onClick(View v)
    {
        startActivity(new Intent("com.example.intenttest.SecondActivity"));//指定activity的名字
    }
}

这就是第一个组件(建工程的时候,就在AndroidManifest.xml文件中注册过了,不要瞎操心) onClick()里面的这句就是跳转了。

下面写第二组件

secondactivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  <TextView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="这是第2个活动"/>
</RelativeLayout>

SecondActivity.java

public class SecondActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondactivity);
    }
}

注册(在application标签内加入)

      <activity
            android:name="com.example.intenttest.SecondActivity"
            android:label="@string/activity_second">
            <intent-filter>
                <action android:name="com.example.intenttest.SecondActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

这里有一个intent-filter,表示意图筛选器,其他活动就是通过这个东西来启动本活动的,相当于这货是向外暴露本activity,或者说,做一个说明限定。

(android中定义的活动,可以被任意应用程序调用,所以意图筛选器的名称要写的很清楚)

(当然如果不幸,俩筛选器的名称一样,那系统会提示您做默认选择的;如果要清楚默认,要到setting—> application—>找到应用程序 app info ---> clear default)

点击按钮,就显示第二个activity了。

小结:intent确实可以连接两个activity,关键代码是:

startActivity(new Intent(activity的名字));

补充:如果要启动的activity是本类的activity,那么可以有另外一种写法:

startActivity(new Intent(this, SecondActivity.class));

2.  从意图返回结果

大概想了想怎么回事儿:(我自己的理解,不知道有没有问题)

上面的例子,主Activity启动SecondActivity是用的 startActivity()方法。

现在要从第二个活动返回结果给主活动,那么必须事先把两个活动都标示好,requestCode和resultCode分别标示主调活动和被调活动

并且主活动启动第二个活动的时候用

startActivityForResult(Intent data,int requestCode);

还要有一个活动来处理被调活动传来的数据:

onActivityResult(int requestCode, int resultCode, Intent data);

被调活动?它做的事儿就相对比较简单了:在Intent中设置数据,用resultCode标示.

setResult(int resultCode, Intent data);

玩一把:

secondactivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  <TextView
      android:id="@+id/tv0"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="这是第2个活动"
       android:gravity="center_horizontal"/>
  <EditText
      android:id="@+id/et0"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="请输入要传回的数据"
      android:layout_below="@id/tv0"
      />
  <Button
       android:id="@+id/btn2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/et0"
      android:text="传回去"
      />
</RelativeLayout>

SecondActivity.java

public class SecondActivity extends Activity implements OnClickListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondactivity);
        Button btn2 = (Button) findViewById(R.id.btn2);
        btn2.setOnClickListener(this);

    }

    @Override
    public void onClick(View v)
    {
        //最好检验一下用户是否输入了
        Intent data = new Intent();
        EditText et = (EditText) findViewById(R.id.et0);
        if(et.getText()!=null)
        {
            data.setData(Uri.parse(et.getText().toString()));// 这里设置数据格式应该还有多种方式,不单单有Uri data
            setResult(RESULT_OK,data); //resultCode也可以写自己定义的,比如1啊、2啊之类的

            finish(); // 结束该活动,并将控制返回给主调者
        }
    }
}

int android.app.Activity.RESULT_OK = -1 [0xffffffff]

Standard activity result: operation succeeded.

这就是说,RESULT_OK是预定义的 int 类型的 resultCode。

除此之外还有一个:RESULT_CANCELLED

下面处理主activity,也就是主调活动:

public class MainActivity extends Activity implements OnClickListener
{

    private int request_Code = 1;
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button) findViewById(R.id.btn1);
        btn.setOnClickListener(this);

    }
    @Override
    public void onClick(View v)
    {
        startActivityForResult(new Intent("com.example.intenttest.SecondActivity"),request_Code);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==1 && resultCode==RESULT_OK)
        {
            Toast.makeText(this, data.getData().toString(), Toast.LENGTH_LONG).show();
        }
    }
}

requestCode如果设置为-1,那么

startActivityForResult(new Intent("com.example.intenttest.SecondActivity"),request_Code);

和startActivity(new Intent(被调activity)); 一样了

赶快看看效果:

很成功啊,很不错啊!

补充一点:

上面传值一律用的 intent对象.setData()或者getData() ,应该还有其他方式。再说吧。


Intent相关的更多相关文章

  1. Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

    前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...

  2. Activity Intent相关FLAG介绍

    先首先简单介绍下Task和Activity的关系   Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activity ...

  3. Android中intent相关,setFlag(xx);

    intent.setFlags(参数)://参数用法如下 :FLAG_ACTIVITY_CLEAR_TOP: 例如现在的栈情况为:A B C D .D此时通过intent跳转到B,如果这个intent ...

  4. Android之Intent相关知识

    什么是Intent?Intent的作用? Intent是一个消息传递对象,我们可以通过它来启动其他组件或者在组件之间传递数据. 通过Intent启动其他组件 Intent可以用来启动Activity, ...

  5. 显示intent和隐示intent有什么区别

    显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent. 隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent. 说明:And ...

  6. Android开发之Intent略解

    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...

  7. Android中Intent传值与Bundle传值的区别详解

    Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...

  8. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

  9. 最全面的Android Intent机制讲解

    对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...

随机推荐

  1. Sql server cast(as nvarchar) 默认长度问题

    Sql server 在我的SQL语句中:sql=".........cast(ziduan as nvarchar) ..............." 这样之后,ziduan被转 ...

  2. CDC ->> 在某个SQL Server中开启CDC功能

    USE AdventureWorks;GO--开启某个数据库的CDC功能EXEC sys.sp_cdc_enable_db;GO--is_cdc_enabled栏位为1代表开启CDC功能了SELECT ...

  3. 《c程序设计语言》读书笔记--反转字符串

    #include "stdio.h" #define Num 100 void reverse(char words[]) { int i, j, c, n=0; while(wo ...

  4. leetcode:Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  5. [转载]流式大数据处理的三种框架:Storm,Spark和Samza

    许多分布式计算系统都可以实时或接近实时地处理大数据流.本文将对三种Apache框架分别进行简单介绍,然后尝试快速.高度概述其异同. Apache Storm 在Storm中,先要设计一个用于实时计算的 ...

  6. Hack 【二分答案】

    题意:给出n门课程,每一门课程考的分数,每一门课程的学分,求最多删去k组数据之后能够得到的最大加权平均数 先开一个数组x[],其中x[i]=1代表没有删除这门课程,x[i]=0表示删除了这门课程 然后 ...

  7. HDU 3790 最短路径问题【Dijkstra】

    题意:给出n个点,m条边,每条边的长度d和花费p,给出起点和终点的最短距离和花费,求最短距离,如果有多个最短距离,输出花费最少的 在用dijkstra求最短距离的时候,再用一个f[]数组保存下最少花费 ...

  8. HDU 1158 Employment Planning【DP】

    题意:给出n个月,雇佣一个人所需的钱hire,一个人工作一个月所需要的钱salary,解雇一个人所需要的钱fire,再给出这n个月每月1至少有num[i]个人完成工作,问完成整个工作所花费的最少的钱是 ...

  9. Context上下文对象(抄书的)

    Servlet上下文 ServletContext 上下文接口    ServletContext接口    每一个应用都有唯一的一个上下文对象,即为ServletContext对象    Servl ...

  10. 旧书重温:0day2【2】 实验:三种获取kernel32.dll基址的方法

    0x01 找kernel32基地址的方法一般有三种: 暴力搜索法.异常处理链表搜索法.PEB法. 0x02 基本原理 暴力搜索法是最早的动态查找kernel32基地址的方法.它的原理是几乎所有的win ...