Intent在Android开发中起了非常大的作用,它是Android程序中各组件之间进行交互的很重要的一种方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据,Intent一般可以被用于启动活动、启动服务以及发送广播等场景
Intent有多个构造函数的重载,这里我们先只介绍几个常见的
两个Activity的跳转
Intent分为显示和隐式
显式Intent
首先我们需要给Activity的跳转一个事件发生的点,所以我们在控件上添加一个按钮,然后给这个按钮添加一个跳转事件,也就是从一个activity跳转到另一个activity,我们在监听按钮的方法中显示创建Intent对象,这个对象的构造函数有很多重载,我们使用其中接收两个参数的构造方法,两个参数分别是启动活动的上下文,也就是跳转的起始页面,第二个就是终点,也就是想要跳转到的页面。
那么如何使用呢?Activity类中提供了startActivity()方法,这个方法专门用来启动活动的,他接收一个intent参数,这样就可以把上面创建好的Intent对象传入进去
regist = findViewById(R.id.btn_1);
regist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
//跳转到Button演示界面
Intent intent = new Intent(MainActivity.this,Register.class);
startActivity(intent);
}
});
这样子点击这个按钮就可以跳转到想要跳转到的另一个页面
起始页面
点击登录以后的页面
这上面两个Activity是我提前写好的,所以下去实践的时候需要自己写好需要跳转的两个页面
隐式转换
相对于显示转换,隐式转换要晦涩许多,他把需要启动活动这个事情交给了更抽象的action和category等信息,然后交给系统去分析应该去启动哪些活动,
我们需要去AndroidManifest.xml添加代码
<activity android:name=".Register" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在< action >标签中我们指明了当前活动可以响应com.example.activitytest.ACTION_START这个action,而 < category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有< action >和< category >中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent
然后我们修改MainActivity中按钮的点击事件
regist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
//跳转到Button演示界面
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
}
});
这个时候你再点击按钮是可以跳转的,因为我们设置的category的值是DEFAULT也就是默认的,所以这里不影响,那么如果说我这里给了category值呢?
我们首先先修改AndroidManifest.xml,在action中修改一下,改成以下代码
<activity android:name=".Register" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
这个时候如果我们再重新启动程序的话,按照刚刚的程序,就会跳转失败的,程序会崩溃
所以我们就要去修改java代码
regist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
//跳转到Button演示界面
Intent intent = new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
这里就需要在这里添加一个category,然后再重新启动这个时候就会成功
其他隐式用法
之前也提到过Intent隐式用法还有更多,那么我们会经常性的在用一个app的时候会出现点击一个按钮就进入一个网页的状态,或者说点击一个按钮进入拨号流程,再或者说两个activity的数据交流,那么我们可以挨个来实现一下
调用系统浏览器
接着上面的代码写,那么如何在点击一个按钮的时候调用系统浏览器呢,我们需要进按钮监听方法中去修改代码
regist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
这个时候我们给Intent参数一个常量Intent.ACTION_VIEW,这个是Android系统的动作,然后调用setData方法,给他传入一个url,也就是把这个字符串解析成一个Uri对象,然后他就可以直接跳转到你输入的网址中,让我们来看看这个代码的效果
我将点击事件放在登录按钮上的,也就是点击登录以后会直接进入到百度的页面
上面出了点小故障,这是我在宿舍断网以后写的,所以这可能进外网有点问题=-=