Android开发学习之路(四)Intent入门初级

首先,什么是Intent呢?

官方是这样介绍的:一个Intent就是对一个将要执行操作的抽象描述。

这并不容易理解,所以借用百科里的解释,可以这样定义Intent:

Intent(意图)主要是解决 Android应用的各项组件之间的 通讯
Intent负责对应用中一次操作的 动作动作涉及数据附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给被调用的组件,并完成组件的调用。
因此,Intent在这里起着一个媒体 中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
例如,在一个联系人维护的应用中,当我们在一个 联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。

这样我们就懂了,简单点说Intent在应用程序中起着协调,调度的作用,即在一个Activity中,通过Intent的描述,找到这个Activity所需要调用的组件,并且通过startActivity(Intent),startService(Intent),实现调用。

其实Intent的作用不止刚刚说的这一种,在以后的学习里再补上。

介绍了这么多Intent的定义,目的是什么呢?理解Intent的作用对我们的学习有着至关重要的作用,因为不夸张地说,Intent是Android开发的灵魂。

下面开始学习

一、拨打电话

1,创建一个按钮:

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="点击拨打电话" />
2,创建Button变量并找到button:

private Button button = null;
button = (Button) findViewById(R.id.button);
3,为Button添加事件;

button.setOnClickListener(listener);
private View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        };
4,定义这个事件:

private View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:11011011010"));
            startActivity(intent);
            }
        };

下面解释一下这段代码:

第一行:由于我们要在MainActivity里面调用打电话的操作,所以需要使用Intent,所以第一件事就是新建一个意图;

新建了意图,接着我们要对这个意图进行描述

第二行:描述了意图的动作,这里面Android定义了很多动作我们可以按需选择;

第三行:描述了打电话这个操作需要拨打的号码;

第四行:这句代码的含义是,当我们点击按钮之后,就会调用系统所找到的符合Intent描述的组件,并且执行它。

大家可能以为现在程序已经可以执行了,其实不然,为了安全起见,像打电话,上网,发短信之类的操作,应用程序必须获得安卓系统的许可才可以正常运行。所以:

5,申请权限

在配置清单里添加如下:

<uses-permission android:name="android.permission.CALL_PHONE" />

二,通过Intent启动新的Activity

1,创建SecondActivity

Android Studio在创建一个新的Activity之后会自动创建关于它的布局文件,以及自动在配置清单里声明SecondActivity:

<activity android:name=".SecondActivity" />

2,编写Second的布局:

<TextView
    android:id="@+id/secondtxt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Second hear" />
    android:text="Second hear"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Second" />
我们为Second添加了一个按钮,改变了它的文本

3,在Main中调用Second

(1),创建Intent对象:

Intent intent = new Intent();

(2),描述Intent,即为Intent指定类:

intent.setClass(MainActivity.this, SecondActivity.class);
setClass方法的第一个参数是当前Activity,第二个是要跳转的Activity

(3),启动Intent:

startActivity(intent);
三、使用Intent传递参数

1,使用Intent中的putExtra方法

这个方法可以在我们的Intent描述中添加一些信息,并且可以是各种信息,甚至可以是对象,以后再进行更加深入的学习:

intent.putExtra("str", "Hello !!!");
  这里我传递了一个字符串

   2,在Second中接受传递的参数

public class SecondActivity extends AppCompatActivity {
private TextView secondtxt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        String str = bundle.getString("str");
        secondtxt = (TextView)findViewById(R.id.secondtxt); 
        secondtxt.setText(str);

    }
}

解释一下:

首先声明了一个TextView对象;

接着声明了一个Intent对象,并且使用了getIntent来接收MainActivity传来的Intent;

然而,怎么接受Intent中的参数呢

由于我们是使用putExtra传递的参数,所以使用getExtras方法接受参数,ctrl点击getExtras,我们可以发现它返回的是一个Bundle对象,所以我们声明一个bundle对象来接受这个参数;

由于我们传递的是一个字符串,所以声明一个字符串来接受;

做到这里参数已经接收到了,下面显示在Second中,最后两行就是这个作用。

四、使用Intent返回参数

假如我们想点击Second的按钮可以返回到Main中该怎么办

1,在Main中的listener添加如下代码:

startActivityForResult(intent,REQUEST_CODE);
第一个参数是Intent,第二个是一个常量,所以我们还要定义一个常量:

private final static int REQUEST_CODE = 1;
解释一下这个方法:

如果我们调用了这个方法且其中的REQUEST_CODE是大于0的,那么这个方法就会调用一个叫做onActivityResult的方法,所以接下来我们需要定义这个方法:

使用override找到新建这个方法:


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}
这个方法一会再完善,先放在这

2,为Second的Button添加事件;

secondbtn = (Button)findViewById(R.id.button2);
secondbtn.setOnClickListener(listener);
定义listener

private OnClickListener listener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.putExtra("back" ,"Back Date");
        setResult(RESULT_CODE,intent);
        finish();
    }

};
解释一下这个listener:

既然是跳转Activity那么还是要使用Intent

这里着重解释一下倒数第二行

这个方法的含义是设置要返回给intent的数值为RESULT_CODE,所以我们也要定义一下这个常量;

public  final static int RESULT_CODE = 1;
最后一行的是在我们点击了按钮,即返回了数值之后,就结束Second。

3,完善onActivityResult方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_CODE){
        if(resultCode == SecondActivity.RESULT_CODE){
            Bundle bundle = data.getExtras();
            String str = bundle.getString("back");
            Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();;
        }
    }
}

可以看到,方法中的三个参数分别为,两个常量和一个intent对象,requestCode也就是startActivityForResult中的requestCode,resultCode也就是setResult中的resultCode。所以,这个方法也就是再接收到返回参数之后mainActivity要做的事

代码表示的意思是:

如果接收到返回参数后,就返回Main并且让Main执行一些操作。

最后,说明一下requestCode和resultCode的用处:

以上所说的都是一个Activity里面只有一个按钮,假如有多个按钮,并且需要个个按钮一一对应的话,那么我们就可以定义多个requestCode和resultCode来解决这个问题。

有关Intent就先学到这里。

Android开发之路是如此有趣,而我却一人独行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值