Android平台Intent分为两种:显示Intent和隐式Intent

显式Intent会准确地告诉Android运行时需要激活哪个组件。举个例子,如果我想让别人帮忙买包饼干。显示Intent会说,可以帮我去xxx街的xxx便利店买包饼干吗。而隐式Intent说,可以帮我买包饼干吗。隐式Intent仅指定操作。当我们使用隐式Intent的时候,一般是想使用我们程序中不存在的功能。如果我们的程序有这个功能,一般优先考虑使用显式Intent。因此,当我们使用隐式Intent的时候,Android会在我们的设备上寻找合适的功能响应我们的请求。

通过一个例子能更好的理解什么是隐式Intent

打开Android Studio,新建一个项目,项目的细节如下表所示

Project Detail Value
Application name ImplicitIntentsTest
Company domain Use your website name
Kotlin support Yes
Form factor Phone and Tablet only
Minimum SDK API 23 Marshmallow
Type of activity Empty
Activity name MainActivity
Layout name activity_main
Backward compatibility Yes.AppCompat

最后的效果图

效果图
效果图

这里我不打算使用xml布局,而是使用代码动态生成菜单栏

MainActivity.kt代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package cn.com.sshpark.ch12implicitintents

import android.content.Intent
import android.net.Uri
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menu?.add("Web") // 这里添加菜单栏的选项
menu?.add("Map")
menu?.add("Phone Number")
return super.onCreateOptionsMenu(menu)
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {

var m_uri: Uri
var m_intent: Intent = Intent()

when (item?.toString()) {
"Web" -> {
m_uri = Uri.parse("http://sshpark.com.cn")
m_intent = Intent(Intent.ACTION_VIEW, m_uri)
}
"Map" -> {
m_uri = Uri.parse("geo:40.7113399,-74.026346")
m_intent = Intent(Intent.ACTION_VIEW, m_uri)
}
"Phone Number" -> {
m_uri = Uri.parse("tel:18274777777")
m_intent = Intent(Intent.ACTION_DIAL, m_uri)
}
}
startActivity(m_intent)
return true
}
}

简单解释一下,onCreateOptionsMenu回调会在onCreate方法之后的某个时间被调用,它会创建一个简单的菜单栏。onOptionsItemSelected则会在用户点击的时候响应自定义的动作。

最后,程序运行效果为

Web
Web
Phone Number
Phone Number