Android开发学习之路(四)Intent入门初级
首先,什么是Intent呢?
官方是这样介绍的:一个Intent就是对一个将要执行操作的抽象描述。
这并不容易理解,所以借用百科里的解释,可以这样定义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开发之路是如此有趣,而我却一人独行。