Android 实现界面之间的转跳

过程说明:在一个主界面(主Activity)上能连接许多不同功能模块,当子模块的事情做完了之后就要回到主界面去,有时候还会带上一些子模块完成的数据交给主Activity去处理

      //启动B
Intent bintent = new Intent(A.this,B.class); //创建启动B的意图
//设置bintent的Bundle的一个值
String bsay = "Hello,this is B speaking";
bintent.putExtra("listenB",bsay);
startActivityForResult(bintent,0);//参数(Intent intent,Int requestCode)的requestCode对应回收Boudle时使用
//重写onActivityResult()来处理返回的数据(回调)
//这里有三个参数requestCode,resultCode,data
protected void onActivityResult(int requestCode,int resultCode,intent data)
{
   switch(resultCode)
   {
    case: RESULT_OK;
     Boudle b = data.getExtras();//data为B中穿过来的intent
     String str=b.getString("listenB");//str即为回传的值“Hello,this。。。”
     break;
     default:
       break;
   }
}


-----------------------------------------------------------------------
//----B.java--//
//用setRest()准备好要回传的数据后,只要使用finish()的方法就能把打包好的数据发回会给A,
//并且运行onActivityRestult()部分的代码


Intent aintent = new Intent(B.this,A.class);
.....将数据打包到aintent Bundle的过程'
setResult(RESULT_OK,aintent); //这里有2个参数(int resultCode,Intent intent)
......
finish();
----------------------------------------------------------------
startActivityForResult(Intent intent,Int requestCode)
intent 传给B的意图
requestCode >0即可,用于在onActivityRest()区别哪个子模块回传的数据,如果还有C.java,D.java...区分不同
//的requestCode


setRestult(int resultCode,Intent intent)
resultCode如果B子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。一般都用RESULT_OK
intent 回传给A的onActivityResult()


onActivityResult(int requestCode,int resultCode,Intent intent)
回调函数,如果不对int requestCode,int resultCode区别,那么回到A的onActivityResult()会无差别处理



Intent对象描述

Intent负责对应用中一次操作的动作、动作涉及的数据、附加数据进行封装,Android操作系统根据这个Intent的内容
再去找到对应的组件,把这个Intent对象传递给对方,(android操作系统此时充当快递员的角色)。
Intent不仅仅可以实现应用app之间的通信,还可以实现在应用app内部不同的activity之间的通信。
Intent专门提供组件之间互相调用的相关信息。


通过Context.startActivity() or Activity.startActivityForResult() 启动一个Activity;
通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;
通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(),  Context.sendStickyBroadcast()) 发给broadcast receivers。


Intent的属性

1) action--要执行的动作

  sdk中已经定义的常量


也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR”),并可定义相应的Activity来处理我们的自定义动作。

2)Data,也就是执行动作要操作的数据

  Android中action要操作的数据,用URI(uniform resource Identifier)来标志要操作的数据。不同action的data类型是不同的,如如在联系人应用中,一个指向某联系人的URI可能content(目录)为:content://contacts/1;如ACTION_EDIT(显示数据,让用户来编辑)指定Data为 文件URI,打电话为tel:URI

3)type,用于显式的表示data的类型,虽然android系统可以通过解析data而知道它的类型,但是根据这个type属性的设置可以不用解析,直接知道类型

4)category(类别)

5)component(组件)如果使用这个属性的话,那么可以直接转掉到这个属性所指的组件。

6)extras(额外信息)这个属性用来为新启动的activity提供 一些信息,如:当登录界面转跳到功能界面的时候,可以为功能界面提供 登录者的信息。

    如:当要发送电子邮件的时候,可以把要发送的 联系人信息和要发送的内容,放进extras内,然后把带有这个extras的Intent通过操作系统递给 邮件发送组件。


注意:  Intent 来启动另一个组件 分为 1.显示启动 2.隐式启动    1.显示启动 可以在代码中指定要启动的确定组件。   2.隐式启动 只在代码中提出了对方的

          的条件,由操作系统根据条件来刷选出 符合条件的组件。

      Android系统的刷选机制

android通过查找AndroidManifest.xml文件中注册的activity的intent--filter来确定目标组件。主要是action,category,type来确定。

  • 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
  • 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
  • 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
  • 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别(需要什么,供货商必须并且至少满足需求)。

intent用法例子:


1.无参数Activity跳转

Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);   

 

2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)

Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra(“test”, "shuju”);
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);

 

对于数据的获取可以采用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

3.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)

        Intent intent=getIntent();
        Bundle bundle2=new Bundle();
        bundle2.putString("name", "This is from ShowMsg!");
        intent.putExtras(bundle2);
        setResult(RESULT_OK, intent);

4.回调上一个Activity的结果处理函数(onActivityResult)

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==REQUEST_CODE){
            if(resultCode==RESULT_CANCELED)
                  setTitle("cancle");
            else if (resultCode==RESULT_OK) {
                 String temp=null;
                 Bundle bundle=data.getExtras();
                 if(bundle!=null)   temp=bundle.getString("name");
                 setTitle(temp);
            }
        }
    }

传送SMS/MMS
   1. //调用短信程序 
   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
   3. it.putExtra("sms_body", "The SMS text");   
   4. it.setType("vnd.android-dir/mms-sms");  
   5. startActivity(it); 
   1. //传送消息 
   2. Uri uri = Uri.parse("smsto://0800000123");  
   3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);  
   4. it.putExtra("sms_body", "The SMS text");  
   5. startActivity(it); 
   1. //传送 MMS  
   2. Uri uri = Uri.parse("content://media/external/images/media/23");  
   3. Intent it = new Intent(Intent.ACTION_SEND);   
   4. it.putExtra("sms_body", "some text");   
   5. it.putExtra(Intent.EXTRA_STREAM, uri);  
   6. it.setType("image/png");   
   7. startActivity(it); 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值