使用Intent能够使程序在不同活动中跳转,意及能够使用不同界面。Intent用法分为显示和隐式
Intent概念:Intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
Intent一般可被用于启动活动、启动服务、以及发送广播等场景
##########################################################
前期准备工作
1.创建一个项目(IntentTest),使用一个默认的空的活动MainActivity
2.修改activity_main.xml布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/button_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 1" /> </RelativeLayout>
2.新建一个活动SecondActivity
Activity Name = SecondActivity
Layout Name = activity_second
3.修改activity_second.xml布局文件
代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 2" /> </LinearLayout>解释:定义一个按钮,按钮上文本显示为Button 2
4.修改SecondActivity.java类
代码如下:
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏标题栏 setContentView(R.layout.activity_second); }5.在AndroidManifest.xml中为SecondActivity活动进行注册
在<application></application>之间加入
<activity android:name=".SecondActivity" android:label="@string/title_activity_second" > </activity>
显示使用Intent
Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Class<?> cls)
该构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文
第二个参数Class则是指定想要启动的目标活动
Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动,它接收一个Intent参数
我们将构建好的Intent传入startActivity()方法就可以启动目标活动
1.修改MainActivity类中按钮的点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=(Button)findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "You click Button 1", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); }
2.修改SecondActivity类中按钮的点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); Button button=(Button)findViewById(R.id.button_2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(SecondActivity.this, "You Click Button 2", Toast.LENGTH_SHORT).show(); finish(); } }); }
程序生成后,手机出现界面1,点击button1按钮,界面跳转到界面2,点击button2,界面跳转会界面1
###########################################
隐式使用Intent
隐式Intent通过指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮助我们找出合适的活动去启动
1.修改AndroidManifest.xml文件,修改活动如下:
<activity android:name=".SecondActivity" android:label="@string/title_activity_second" > <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
2.修改MainActivity类中按钮的点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=(Button)findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "You click Button 1", Toast.LENGTH_SHORT).show(); //Intent intent=new Intent(MainActivity.this, SecondActivity.class); Intent intent=new Intent("com.example.activitytest.ACTION_START"); startActivity(intent); } }); }note: android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中
点击运行按钮,程序成功运行
#######################################################3
ADD:每个Intent中只能指定一个action,但却能够指定多个category.
上述的Intent中只有一个默认的category,再增加一个测试一下
1.修改AndroidManifest.xml文件
<activity android:name=".SecondActivity" android:label="@string/title_activity_second" > <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> </application>
Button button=(Button)findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "You click Button 1", Toast.LENGTH_SHORT).show(); //Intent intent=new Intent(MainActivity.this, SecondActivity.class); Intent intent=new Intent("com.example.activitytest.ACTION_START"); intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent); }
运行程序,成功
#################################################
隐式Intent的更多用法
使用隐式Intent,不仅可以启动自己程序内部的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享称为可能
例如:在应用程序中展示一个网页
修改MainActivity中按钮点击事件
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "You click Button 1", Toast.LENGTH_SHORT).show(); //Intent intent=new Intent(MainActivity.this, SecondActivity.class); //Intent intent=new Intent("com.example.activitytest.ACTION_START"); //intent.addCategory("com.example.activitytest.MY_CATEGORY"); Intent intent=new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); } });程序中首先指定Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW.
然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去
此时重新运行程序,在MainActivity界面点击按钮就可以打开系统浏览器
例如:在程序中调用系统拨号界面
修改MainActivity中按钮点击事件
Button button=(Button)findViewById(R.id.button_1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "You click Button 1", Toast.LENGTH_SHORT).show(); //Intent intent=new Intent(MainActivity.this, SecondActivity.class); //Intent intent=new Intent("com.example.activitytest.ACTION_START"); //intent.addCategory("com.example.activitytest.MY_CATEGORY"); Intent intent=new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } });
Intent.ACTION_DIAL是一个Android系统的内置动作