作者:夏至 欢迎转载,也请保留这段申明,谢谢
Android的通信桥梁 —— Intent 。
使用一个activity实在是太简单了,布局上也有限,那我们能不能像我们真机上的一样,一点就跳到另一个界面去了。这里我们就使用Intent,在活动中穿梭。至于为什么学着UI组件,突然跑到这个家伙来,那当然是为下一节做准备啦。除了活动,它还可以是服务或者广播。启动可以下列方法:
- startActivity(Intent)/startActivityForResult(Intent):来启动一个Activity
- startService(Intent)/bindService(Intent):来启动一个Service
- sendBroadcast:发送广播到指定BroadcastReceiver
这里,我们就简单地用 Activity 来当例子,毕竟用得最多的就是活动了。
显式Intent与隐式Intent的区别
显式Intent:
通过组件名指定启动的目标组件,比如startActivity(new
Intent(A.this,B.class));每次启动的组件只有一个。隐式Intent:
不指定组件名,而指定Intent的Action,Data,或Category,当我们启动 组件时,会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件, 当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框
1.1 显示Intent
首先,我们先新建一个布局,就叫做sec_linearlayout好了:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btnBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按键测试"/>
</LinearLayout>
然后,我们再新建一个新activity,名字可以自己取,比如我的取为SencondActivity,让它继承Activity:
```java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sec_linearlayout);
}
}
<div class="se-preview-section-delimiter"></div>
最后,我们在AndroidManifest.xml,把我们新定义的activity包含进去。这里因为不是主activity。所以只要一行就可以了。如下:
接下来就是在主Activity写程序了,由上面的 Intent(A.this,B.class))和startActivity(Intent)就可以了:
setContentView(R.layout.linearlayout);
Button button = (Button)findViewById(R.id.btnInter);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
<div class="se-preview-section-delimiter"></div>
1.2 隐式Intent
传递数据给下一个活动
我们先来看一下AndroidManifest.xml文件中标签
其中上图画圈圈的地方,就是我们隐式Intent最主要的东西了。
- aciotn : 表示当前可以相应的活动,有且只有一个。
- category:表示包含的一些附加信息,和相互配合,可以多个。
可以试试这个效果,先体验一下:
这里我们假设一下,比如我们就让第二个activity浏览我们手机默认浏览器,并跳到百度。在事件开发中,我们不可能因为一个事件,而又重新去开发一个浏览器,这不实现,所以,我们可以调用系统的。修改如下:
<activity
android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<div class="se-preview-section-delimiter"></div>
效果如图:
关于隐式Intent我们就先了解到这,先简单了解就行,后面我们再来深入研究。
1.3 多个活动之间传递数据
在启动活动时传递数据的思路其实很简单,Intent中提供了一系列 putExtra(string name,value)方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了,接收可以用:getStringExtra(string name
putExtra(string name,value):name为上下文键值,第二个为要传递的数据,支持多种类型
所以,主activity这样写:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("data","hello world");
startActivity(intent);
}
<div class="se-preview-section-delimiter"></div>
第二个活动这样写
这样,我们就完成了想下一个活动传递的功能了,当然了,不一定是字符串,可以是内容,文件数据等其他。
里我们使用了字符串,所以用getSringExtra()来接收,如果是整型,则用 getIntExtra(),如果是boolean 型,则用 getBooleanExtra(),以此类推。
返回数据给上一个活动
既然可以传数据给下一个活动,那么肯定能传递数据给上一个活动了。不过这里我们不再用startActivity(),而是用startActivityForResult()来启动活动。该方法接收两个参数,第一个还是Intent ,第二个是请求码。直接看代码:主activity:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent(A.this,B.class));
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
由于我们使用startActivityForResult()来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因为我们需要在MainActivity中重写这个方法来获取数据。
这样,当第二个活动被销毁的时候,就能返回数据到onActivityResult()来,我们就能获数据了。
Intent 就暂时怎么多了,深入我们在进阶在来讲解。
不得不吐槽一下CSDN的图片粘贴的问题,每次都上传真心蛋疼,有谁支个招吗。。。。