在我们的手机App中,点击应用图标,进入的界面就是该应用的主活动,当我们点击其他按钮进去其他的活动,这样的过程该如何实现呢? 换句话说就是怎样才能由主活动跳转到其他活动?
Intent
Intent 大致可以分为两种: 显式 Intent 和 隐式 Intent
显示Intent
首先右击包名-->New-->Activity-->Empty Activity, 会弹出一个创建活动的对话框,可以给活动命名, 勾选Generate Layout File,给布局文件起名, 但不要勾选 Launcher Activity选项(因为这个选项用于设置主活动).
注意: 任何一个活动都是需要在 AndroidManifest.xml 中注册, 不过 Android Studio 已经帮我们自动完成了. 可以进入 AndroidManifest.xml 中看看, 由于 SecondActivity不是主活动.因此不需要配置标签里的内容,注册活动的代码也很简单.
Intent(意图) 是 Android程序中各组件之间进行交互的一种重要方式, 它不仅可以指明当前组件想要执行的动作, 还可以在不同组件之间传递数据. Intent一般可被用于启动活动, 启动服务以及发送广播等场景.
Intent 有多个构造函数的重载, 其中一个是Intent (Context packageContent, Classcls). 这个构造函数接收两个参数,第一个参数Content 要求提供一个启动活动的上下文, 第二个参数Class 则是指定想要启动的目标活动, 通过这个构造函数就可以构建出 Intent 的 "意图". Activity类中 提供了 一个 startActivity() 方法, 这个方法是专门用于启动活动的, 它接收一个Intent 参数.
效果:
AndroidManifest.xml 文件
FirstActivity类
package com.example.sunny.explicitintent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
// 创建按钮
Button btn = (Button)findViewById(R.id.button_1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建意图
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
// 开启意图
startActivity(intent);
// 销毁活动
// finish();
}
});
}
}
使用这种方式启动活动, Intent 的 "意图" 非常明显, 因此称之为 显示 Intent
隐式Intent
相比于显式 Intent ,隐式 Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的 action 和 category 等信息,然后交由系统去分析这个Intent, 并帮我们找出合适的活动去启动.
通过在标签下配置的内容,可以指定当前活动能够响应action 和 category, 打开 AndroidManifest.xml, 添加如下代码
只有 和 中的内容同时能够匹配上Intent中指定的action 和 category时, 这个活动才能响应 Intent.
ThirdActivity类
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Button btn = (Button)findViewById(R.id.button_1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建隐式意图
// 当和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent
// 每一个Intent只能指定一个action,但却能指定多个category
Intent intent = new Intent("com.example.sunny.activitytest.ACTION_START");
// 注意: 因为category是一种默认的category,在调用startActivity方法会自动将category添加到Intent.
startActivity(intent);
}
});
}
}
在上面代码中 没有看到 category 为什么也能响应,因为 android.intent.category.DEFAULT 是一种默认的category,在调用 startActivity
()方法的时候会自动将这个 category 添加到 Intetn. 每一个Intent 中只能指定一个action,但却能指定多个 category.
我们可以在ThirdActivity类中再添加一个
intent.addCategory("com.example.sunny.activitytest.ZY_CATEGORY");
然后运行程序会发现报错, 这是因为刚刚在Intent中添加的 category,在FourActivity 的 标签中并没有声明可以响应这个
category,所以就出现了没有任何活动能够响应该Intent的情况.
效果如显示Intent相同.
使用隐式Intent ,我们可以启动自己程序内的活动, 还可以启动其他程序的活动,这使得 Android多个应用程序之间的功能共享
称为可能, 比如说 在应用程序中需要展示一个网页,只需要调用系统的浏览器来打开这个网页即可!
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Button btn = (Button)findViewById(R.id.button_1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 创建隐式意图
// 当和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent
// 每一个Intent只能指定一个action,但却能指定多个category
// Intent intent = new Intent("com.example.sunny.implicitintent.ACTION_START");
// 注意: 因为category是一种默认的category,在调用startActivity方法会自动将category添加到Intent.
// intent.addCategory("com.example.sunny.implicitintent.ZY_CATEGORY");
// startActivity(intent);
// 打开一个网页
// Intent intent = new Intent(Intent.ACTION_VIEW);
// intent.setData(Uri.parse("http://www.baidu.com"));
// startActivity(intent);
// 调用系统拨号功能
Intent intent1 = new Intent(Intent.ACTION_DIAL);
intent1.setData(Uri.parse("tel:10086"));
startActivity(intent1);
}
});
}
}