Intent隐式启动Activity
隐式启动的好处在于不需要在第一个组件中指明需要启动另外的哪一个组件,而由Android系统来决定,这样有利于降低组件之间的耦合度。
选择隐式启动Activity,Android系统会在程序运行时解析Intent,并根据一定的规则对Intent和组件进行匹配,使Intent上的action、data和category与目标Activity吻合。匹配的组件可以是程序本身的Activity,也可以是Android系统内置的Activity,还可以是第三方应用程序提供的Activity。因此,这种方式强调了Android组件的可复用性。
因为是隐式调用,这种情况下intent的ComponentName一项值为空。此时Intent构造函数的第1个参数是Intent需要执行的动作(action),Android系统支持的常见动作字符串常量可以参考下表。第2个参数是URI,表示需要传递的数据(data)。
ACTION_VIEW 最常用的动作,对以Uri方式传送的数据(data),根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号界面并呼叫指定的电话号码
ACTION_DIAL 打开内置拨号界面,显示Uri中提供的电话号码
ACTION_CALL 打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码
ACTION_ANSWER 打开接听电话的Activity,默认为Android内置的拨号界面
ACTION_DELETE 打开一个Activity,对所提供的数据进行删除操作
ACTION_EDIT 打开一个Activity,对所提供的数据进行编辑操作
ACTION_INSERT 打开一个Activity,在提供数据的当前位置插入新项
ACTION_WEB_SEARCH 打开一个Activity,对提供的数据进行Web搜索
ACTION_PICK 启动一个子Activity,从提供的数据列表中选取一项
ACTION_SEARCH 启动一个Activity,执行搜索动作
ACTION_SENDTO 启动一个Activity,向数据提供的联系人发送信息
ACTION_SEND 启动一个可以发送数据的Activity
我的练习是调用参数为ACTION_CALL和tel:13278891040的intent构造方法并发送,来启动拨号界面并打电话。
这里需要改变的代码就是onCreate()方法里的intent的构造方法
public void onClick(View v) { //第一个参数为action,第二个参数为uri Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:13278891040")); startActivity(intent); }
但在这样运行后,点击MainActivity上的button时出现了错误(在手机上闪退)。Logcat上显示fatal exception:main
百度了一下也没发现比较正式的解释,但他们的错误基本上都在AndroidManifest.xml里面,后来在一个博客里看到说必须“在AndroidManifest中添加 users-permission,并声明使用权限:<uses-permission android:name="android.permission.CALL_PHONE" />这是由于拨打电话属于手机底层的服务,与用户隐私及通话费等相关,因此,程序必须取得相关权限。“
加上之后发现不再报错。可以直接呼出电话了。