Activity之间的通信与自定义Action

Activity之间的通信

Activity 之间的通信是通过Intent实现的

1.由activity A 到B -- 调用同一个应用下的activity

    a.普通方式

    流程:创建一个Intent实例 ,通过Intent指定从哪个Activity到哪个Activity,然后 A实例对象.startActivity(Intent实例)    eg:

    Intent intent = new Intent(A.this,B.class);

    你也可以传参数到目标Activity

    intent.putExtra("key",value);----有个中重载,如果你要传的值是自己定义的类对象,那么这个类必须实现       

java.io.Serializable 接口

    A的实例对象.startActivity(intent);

  b.启动带返回值的Activity

   既然能从A传参数到B,肯定也能从B返回数据给A

   流程: 创建一个Intent实例,然后A的实例对象.startActivityForResult(Intent实例,int类型的请求标示);

   重写A类的onActivityResult(int requestCode, int resultCode, Intent data) ;

   注意:int类型的请求标示必须是唯一的,通常情况下 我们使用布局文件的int表示方式作为请求标示

   eg:

   //启动 带返回值的activity

   Intent intent  = new Intent(A.this,B.class);

   A的实例对象.startActivityForResult(intent, R.layout.main);

   //在B类中 指定返回值

   Intent intent=B的实例对象.getIntent().putExtra("key","hello");

    B的实例对象.setResult(20,intent);

 //重写A类的onActivityResult(int requestCode, int resultCode, Intent data)  接收数据

   @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  
  switch (requestCode) {
  case R.layout.main:
       if(requestCode==20)
       {
        String resultStr= data.getStringExtra("key");
       }
   break;

  default:
   break;
  }
 }

变量resultStr 就是返回值 为 hello;

2.调用不同应用程序的Activity

创建Intent实例时 有很多重载

 public Intent(Context packageContext,Class<?> cls); --- 上面已经使用了

 public  Intent(String action);

 public Intent(String action,Uri uri);

 调用其他应用程序的Activity 就是通过后两种构造实现的 (通过Action 的方式);

a.调用系统的应用程序

         android 系统自带很多功能的应用,像打电话,浏览网页,发送Email等。。

        eg: 打电话

         Intent intent = new (Intent.Action_CALL,Uri.parse("tel:"+电话号码));

         startActivity(intent);

 b.己的Activity Action  供别的应用调用

   流程:在AndroidManifest.xml 中的被调用的Activity的节点下定义Action ,在调用方使用Intent(String action) 构造调用

   注意:两个Activity 可以 属于不同的应用

    eg :

    AndroidManifest.xml 中定义 Action

      <activity android:name=".Main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.myaction"/>
            </intent-filter>
        </activity>

     调用方调用

    Intent intent = new  Intent("com.myaction");

    startActivity(intent);

c.用需要传参的其他应用的Activity

    由第三种构造( public Intent(String action,Uri uri);)  可以了解我们可以通过Uri对象给被调用的Activity传递参数

    分析Uri的格式("tel:12345678")可以发现Uri需要一个头 ("tel"); 这个头在你自定义action 的时候需要自己定义

   这个头也是在Androidmanifest.xml 中定义

    流程:在AndroidManifest.xml 中的被调用的Activity的节点下定义Action 和Uri头,在调用方使用

Intent(String action,Uri uri);构造调用

     eg:

    在AndroidManifest.xml 中定义Action  和 Uri头

   <activity android:name=".Main"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.myaction"/>

         <!--Uri头-->

               <data android:scheme="myscheme"></data>
          </intent-filter>
        </activity>

  在调用方调用

   Uri  uri  = Uri.parse("myscheme://哈哈哈");

   Intent   intent = new  Intent("com.myaction",uri);

   startActivity(intent);

   在被调用方的到传过来的参数

   Uri uri = getIntent().getData();

   String str= uri.getHost();

    str变量得到的值就是“哈哈哈”

 

 

  

 

 

   

 

   

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值