Android
平台Intent
分为两种:显示Intent
和隐式Intent
显式Intent
会准确地告诉Android
运行时需要激活哪个组件。举个例子,如果我想让别人帮忙买包饼干。显示Intent
会说,可以帮我去xxx街的xxx便利店买包饼干吗。而隐式Intent
则说,可以帮我买包饼干吗。隐式Intent
仅指定操作。当我们使用隐式Intent的时候,一般是想使用我们程序中不存在的功能。如果我们的程序有这个功能,一般优先考虑使用显式Intent。因此,当我们使用隐式Intent
的时候,Android
会在我们的设备上寻找合适的功能响应我们的请求。
通过一个例子能更好的理解什么是隐式Intent
打开Android Studio
,新建一个项目,项目的细节如下表所示
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
则会在用户点击的时候响应自定义的动作。
最后,程序运行效果为