Android Intent(意图)介绍
对于Android Intent大家肯定不陌生,Intent顾名思义就是“意图”的意思。其实这个“意图”有点不好理解。其实简单点就是我想要“干什么”。你比如说,我想要“去火车站”、我想要“启动一个Activity”、我想要“启动一个server”、我想要XXX都是意图。Intent有显式Intent和隐式Intent两种情况。
那么问题来了:
一.那到底什么样的Intent是显式的Intent,什么样的Intent是隐式的Intent呢?
为了回答这个问题,请看下面对于隐式Intent和显式Intent的具体介绍
1 隐式Intent
说起隐式Intent就不得不先说在清单文件(AndroidManifest.xml)中的intent-filter。你随便创建一个Android 项目都会在清单文件中看见intent-filter,顾名思义就是Intent的过滤器。而且一个Activity组件的声明中,可以有多个intent-filter。当然也可以没有intent-filter。
举个例子如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--1个intent-filter-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--没有intent-filter-->
<activity android:name=".Main2Activity" />
<!--多个intent-filter-->
<activity android:name=".Main3Activity">
<intent-filter>
<action android:name="com.mytest.MyIntentAction" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="aa/bb"/>
</intent-filter>
<intent-filter>
<action android:name="com.mytest.MyIntentAction1" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent1" android:host="8080"/>
</intent-filter>
<intent-filter>
<action android:name="com.mytest.MyIntentAction2" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent2"/>
</intent-filter>
</activity>
</application>
</manifest>
讲完了AndroidManifest.xml中的Intent-filter.就要看一下如何在代码中一个隐式的Intent,去启动一个组件。下面我们来看一个代码例子,我创建了一个Android 项目,除了默认的MainActivity我又增加了两个Activity:Main2Activity、Main3Activity。
其中Main2Activity由MainActivity启动,暂时不看启动Main2Activity的代码,现在我们先看在Main2Activity中使用隐式的Intent启动Main3Activity的代码。根据AndroidManifest.xml中Main3Activity的声明来看,有三个intent-filter可以启动Main3Activity,所以我随机选一个intent-filter进行Intent的设置就可以了。我选用第三个intent-filter来启Main3Activity。
<intent-filter>
<action android:name="com.mytest.MyIntentAction2" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent2"/>
</intent-filter>
AndroidManifest.xml中的action中的内容和Data中的内容都是我随便写的,因为在android默认的那些action和data的数据中也是一个字符串,所以我们可以设置其为任意字符串。根据这个intent-filter我在Main2Activity.java中的代码实现如下:
package com.mytest;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//创建隐式Intent
Intent intent = new Intent();
//为隐式Intent添加过滤Action,Data和Category的字段,
// 不是说必须这三个字段同时有,这个设置那些是根据清单文件中Main3Activity的某一个intent-filter确定的
intent.setAction("com.mytest.MyIntentAction2");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("myIntent2:" + 110));//后边的110是随便加的,暂时没有什么具体的意思,这就是他的一个用法
//启动Main3Activity
startActivity(intent);
}
}
这就是使用隐式的Intent启动组件。
2 显式Intent
其实显式Intent就很简单了,我们直接来看代码。我在MainActivity.java中使用显式Intent启动Main2Activity,代码如下
package com.mytest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建显示Intent
Intent intent = new Intent(getApplicationContext(),com.mytest.Main2Activity.class);
//启动Activity
startActivity(intent);
}
}
这就是显式的Intent去启动组件。
总的一句话,如果创建Intent的时候,明确指出了要启动的class的名字,就是显示Intent。如果没有明确的指出要启动的class的名,而是通过设置intent的过滤字段启动class,就是隐式Intent.
二.什么时候用显示Intent,什么时候用隐式Itent呢?
一句话:当你启动自己写的同一个APP中的Activity时使用显示Intent,当你要启动其他人写APP中的Activity时使用隐式Intent。
上一篇: 使用DOM技术来对XML文档进行解析范例
下一篇: 使用DOM对XML文档进行创建和解析
推荐阅读
-
Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍
-
Android组件间通信--深入理解Intent与IntentFilter
-
两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)
-
Android开发笔记之:返回键的复写onBackPressed()介绍
-
Android 布局控件之LinearLayout详细介绍
-
Android学习之Intent中显示意图和隐式意图的用法实例分析
-
Android编程开发之打开文件的Intent及使用方法
-
Android ListView列表控件的介绍和性能优化
-
android 自定义控件 自定义属性详细介绍
-
Android-如何将RGB彩色图转换为灰度图方法介绍