Intent基本含义:是用来通知平台 (唤起)处理动作,其动作做什么 取决于 注册了什么动作。例如一个简单的MainActivity. AndroidManifest.xml就注册了相应的动作,允许其他应用唤起该Activity。
Intent的构成:
Intent可以带有action,data(由URI表达),extra
data(key/value map,键值对),指定的类名(成为component name)。一个intent至少携带上述的一个内容。
action: 可以有两种形式,一种是系统自带的,一种是我们在androidManifest.xml 中开发时注册的。
系统自带的intent:
在讲之前说一下知识点:OptionMenu
在手机上,有一个Menu按钮,按下后,可以显示OptionMenu,如下处理
publice boolean onCreateOptonsMenu(Menu menu){
menu.add(0,1,1,R.string.menu_exit);
menu.add(0,2,2,R.string.menu_about);
}
add(int groupId, int itemId, int order, int titleRes),对于exit的menuItem,0表示GroupId,1表示ItemId,这两个Id将用于Menu按下后触发回调函数中用于判断具体是哪个menuItem,第三个表示拜访的顺序,在这里第一个是exit,第二个是about,第四个参数引向strings.xml中定义的内容。
创建的Menu后,需要触发回调函数,这也是一个override的方法,如下处理:
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId() == 1){
//在这个例子中我们只有一个group,所有只需检查itemId就可以了。
finish();
}else if(item.getItemId() == 2){
... ...
}
return super.onOptionsItemSelected(item);
}
让我们来看看有那些系统的Intent.
1.
private void invokeBrowser(){
Intent intent = new Intent(Intent.ACTION_VIEW); //触发浏览器打开指定网页
intent.setData(Uri.parse("http://www.google.com.hk"));
startActivity(intent);
}
private void invokeSearch(){
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.setData(Uri.parse("http://www.google.com.hk"));
startActivity(intent);
}
实际也是触发浏览器,不过名曰网络搜索,和上面ACTION_VIEW不同,运行传递的data为””(empty string),因为ACTION_VIEW对应多个可能的应用,而WEB_SEARCH只对应browser。
2.
private void invokeDial(){
Intent intent = new Intent(Intent.ACTION_DIAL); //打开拨号盘UI,
startActivity(intent);
}
3.
private void invokeCall(){
Intent intent = new Intent(Intent.ACTION_CALL);// 打开拨号盘UI,同时呼出tel:phone_number,和ACTION_DIAL的需要用户按拨打键不同,ACTION_CALL直接呼出,需要授权android.permission_CALL_PHONE
intent.setData(Uri.parse("tel:02012345678"));
startActivity(intent);
}
等等 还有很多相关的系统Intent..可以自行baidu一下。
本文实例:
点击 menu按键: 点击图片中“网页”
再来看 一下mainactivity.java:
package com.example.intentd;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 这里重载了onCreateOptionMenu();方法
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "网页").setIcon(android.R.drawable.ic_menu_send);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case Menu.FIRST + 1:
invokeSearch();
default:
Log.d("pro","get option error.");
break;
}
return true;
}
private void invokeSearch(){
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.setData(Uri.parse("http://www.google.com.hk"));
startActivity(intent);
}
}
接下来的是:需要注册的是Activity,注册方法:在androidManifest.xml 里添加一个activity标签,如:<activity android:name=".AActivity"/> 注意小数点。
通过给出该Component的的package name和class name来进行调用。下面我们试验采用四种类似的方式进行调用,本质是一样的。
方式1:setComponent(ComponentName name);
方式2:setClassName(String packageName, String classNameInThatPackage);
方式3:setClassName(Context context, String classNameInThatContext);
方式4:也是常用的setClass(Context context, Class classObjectInThatContext);
private void basicTest4(){
Intent intent = new Intent();
intent.setClass(this,IntentBasicViewActivity.class);
startActivity(intent);
}
Data。由不同action决定有效的URI的格式。intent.setData(Uri.parse(”xxxxxx”));。被唤起的activity可以同activity.getIntent()来获得intent,然后通该intent的getData()来获取数据。
//触发方。
Intent i = new
Intent(actionName);
String uriStr = "wei://www.flowingflying.com";
i.setData(Uri.parse(uriStr));
this.startActivity(i);
/被触发方。需要在AndroidManifest.xml中在intent-filter中注册data信息,后文详细说明
Intent
intent = this.getIntent();
String data = intent.getData();