android意图Intent

来源:互联网 发布:simulink 电气端口 编辑:程序博客网 时间:2024/05/22 05:06
Intent使用的频率相当高,这里对其用法进行简单的总结
Intent可分为显式和隐式
显式Intent:
在activity跳转方法中的参数就是intent,这个intent我们会new一个
Intent intent = new Intent(Context context,class<?> cls);
或者
Intent intent = new Intent();
intent.setClass(Context context,class<?> cls);
这两种方式做了相同的事
context为启动activity的上下文,cls则为要跳转到的activity的class,比如要从活动A跳到B
Intent intent = new Intent(A.this,B.class);
startActivity(intent);
隐式Intent:
在AndroidManifest文件中,可以在对应的activity标签下加意图过滤器
<activity android:name=".MyActicity">
<intent-filter>
<action android:name="com.hao.activity.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
我们指定了action和category
在代码中可以用intent的另一个构造方法Intent(String action);
Intent intent = new Intent("com.hao.activity.ACTION_START");
intent.addCategory("android.intent.category.DEFAULT");//DEFAULT时这句可以不写,系统会自动添加
当传入的action和category与配置文件中的相同时,系统才会启动这个activity
每个intent只能指定一个action,但可以添加多个category,如果系统没有找到任何activity与我们new的
intent完全相同则会报错
data属性用于提供数据,其接收一个Uri,type属性指定data所指定uri对应MIME类型,格式为xxx/xxx
这两个属性分开设置会互相覆盖,如果都要设置,则需要intent.setDataAndType()
隐式Intent可以用于启动系统自带的一些应用
//打开浏览系百度页面
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
//跳到电话拨号界面
Intent intent = new Intent(Intent.ACTION_DIAL);//Intent.ACTION_CALL可以直接拨打
intent.setData(Uri.parse("tel:110"));

startActivity(intent);

如何通过Intent传递数据??intent可以通过键值对的形式进行数据传递
 例如我们要从活动A跳转到活动B并传给B一些数据,可以在A中把数据放进去
 AIntent.putExtra("name","zhangsan");
 AIntent.putExtra("age",10);
 在B中再把数据取出,要用getIntent()获取到启动的intent:                          
 Intent BIntent = getIntent();
 String name = BIntent.getStringExtra("name");//获取string类型
 int age = BIntent.getIntExtra("age");//获取int类型
 我们还可以用Bundle来传递数据,它像一个数据包可以把我们上面传的东西都打包装进去
 Bundle bundle = new Bundle();
 bundle.putString("name","zhangsan");
 bundle.putInt("age",10);
 intent.putExtras(bundle);//intent传递bundle数据
 接收这个数据也很简单
 Bundle bundle = getIntent().getExtras();
 bundle.getXXX("xxx");
 以上传递的都是基本类型的数据,那么怎么传递一个对象呢?这里有两种方式
 1.Serializable
例如我们要传一个user对象,它有String name和int age属性,当我们用bundle的方式去传时发现会有
错误,提示需要传一个可序列化的对象,那么我们直接让User这个类implements Serializable接口就
可以了,是不是很简单呢!当要取出这个对象时要用User user = (User)intent.getSerializableExtra("xxx");
这种方法虽然简单,但它的效率并不高,所以android为我们提供了另一种方法
 2.Parcelable
这个效率比第一种要高一些,不过也较为繁琐。当我们让User implements  Parcelable后会发现还要重写
两个方法
public int describeContents(){return 0;}
public void writeToParcel(Parcel dest,int flags){
//成员变量要添加set和get方法,如果有多个同类型成员变量可以用writeBundle
dest.writeString(getName());
dest.writeInt(getAge());
}
这样还是不够的,还要一个creator
public static final Creator<User> CREATOR = new Creator<User>(){
@Override
public User createFromParcel(Parcel source){
//要和成员变量对应
return new User(source.readString(),source.readInt());
}
@Override
public User[] newArray(int size){
return new User[size];
}
}
取出时要用intent.getParcelableExtra("xxx");是不是挺麻烦的啊

到现在只介绍了数据从A传到B ,那么怎么要是B有想反给A的数据怎么传呢?有人会说像上面一样传就好了啊,
不,这是不行的。上面会通过startActivity(intent)方法启动B并传数据,难道还要再从B重新启动A再来传数据,
如果通过点击了手机的返回键回到了A呢,这里介绍一个返还数据的方法
 在活动A中不去用startActivity方法启动B而采用startActivityForResult(Intent intent,int RequestCode);
 第一个参数依然是intent,第二个参数是请求码,这个是用来判断数据的来源,因为可能有多个入口来调用这个
 方法,不过处理返回结果的方式却不同。
 在B中把要返回的数据保存起来:
 Intent intent = new Intent();
 intent.putExtra("return","返回的数据");
 setResult(RESULT_OK,intent);//一定要写这个方法,第一个参数是int类型的值,因为可能会
 //出现同一个requestCode请求多个Activity的情况,这是就需要通过resultCode来做check
 finish();
 在A中因为我们用了startActivityForResult方法,所以需要重写onActivityResult方法来获取从B返回的结果
 @Override
 public void onActivityResult(int requestCode,int resultCode,Intent intent){
switch(requestCode){
//可能路由多个入口的情况,通过requestCode来判断
case REQUEST_1:
if(resultCode == RESULT_OK){
//取出返回数据并执行一些操作
String returnStr = intent.getStringExtra("return");
}
break;
case REQUEST_2:
break;
}
 }

0 0
原创粉丝点击