Activity与Activity间的通信

Activity与Activity间的通信

Activity的启动

一个Activity启动另一个Activity最简单的方法就是用startActivity(Intent intent)方法,这个方法调用请求是发送给操作系统的ActivityManager负责创建Activity实例并调用其onCreat()方法。ActivityManager是通过传入startActivity(Intent intent)方法的Intent参数知道需要启动哪一个Activity。

ActivityManager维护着一个非特定应用独享的回退栈。所有应用的activity都共享该回退栈。这也是将ActivityManager设计成操作系统级的activity管理器来负责启动应用activity的原因之一。不局限与单个应用,回退栈作为一个整体共享给操作系统及设备使用。

描述:通过 Demo2Activity 启动 Demo2_1Activity 或 Demo2_2Activity,Demo2_1Activity或Demo2_2Activity退出后把信息回馈到 Demo2Activity

  1. 在Demo2Activity中

    Intent intent = new Intent(Demo2Activity.this, Demo2_1Activity.class);
    intent.putExtra("Demo2Activity", "Hello,Demo2_1Acitvity,this is Demo2Activity");
    startActivityForResult(intent, 0);
    //requestCode必须大于等于0,否则onActivityResult()方法不会执行
    //如果在Demo2_1Acitvity中没有返回消息,那么resultCode会等于requestCode,并且data = null
    

    这样,就把消息传递给了Demo2_1Acitvity

  2. 在Demo2_1Acitvity中
    /*收到 Demo2Activity 的消息*/
    Intent intent1 = getIntent();
    Log.d("demoinfo", "Demo2_1Activity收到:  " + intent1.getStringExtra("Demo2Activity"));
    
    /*给Demo2Activity发送消息*/
    Intent intent2 = new Intent();
    intent2.putExtra("Demo2_1Activity", "I‘m Demo2_1Activity!!");
    //setResult(1); 两种方式,这个是只传一个resultCode
    setResult(1, intent2);
    
  3. 在Demo2Activity中重载onActivityResult(int requestCode, int resultCode, Intent data)方法
    requestCode就是之前在Demo2Activity中startActivityForResult(Intent, int)传入的requestCode
    resultCode就是在Demo2_1Acitvity中setResult(int, Intent);传入的int resultCode
    data就是在Demo2_1Acitvity中setResult(int, Intent);传入的Intent
    

代码:

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.ashzheng.studydemo.R;

public class Demo2Activity extends Activity {

    private Button bt1;
    private Button bt2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2);

        bt1 = (Button) findViewById(R.id.demo2_bt1);
        bt2 = (Button) findViewById(R.id.demo2_bt2);

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Demo2Activity.this, Demo2_1Activity.class);
                intent.putExtra("Demo2Activity", "Hello,Demo2_1Acitvity,this is Demo2Activity");
//                startActivity(intent);
                startActivityForResult(intent, 0);//requestCode必须大于等于0,否则onActivityResult()方法不会执行
            }
        });

        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Demo2Activity.this, Demo2_2Activity.class);
                intent.putExtra("Demo2Activity", "Hello,Demo2_2Acitvity,this is Demo2Activity");
//                startActivity(intent);
                startActivityForResult(intent, 0);//requestCode必须大于等于0,否则onActivityResult()方法不会执行
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.d("demoinfo", "requestCode = " + requestCode);
        Log.d("demoinfo", "resultCode = " + resultCode);
        if(null == data){
            Log.d("demoinfo", "data == null");
            return;
        }

        switch (resultCode){
            case 1:
                Log.d("demoinfo", data.getStringExtra("Demo2_1Activity"));
                break;
            case 2:
                Log.d("demoinfo", data.getStringExtra("Demo2_2Activity"));
                break;
        }

    }
}

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.ashzheng.studydemo.R;

public class Demo2_1Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2_1);

        Intent intent1 = getIntent();
        Log.d("demoinfo", "Demo2_1Activity收到:  " + intent1.getStringExtra("Demo2Activity"));

        Intent intent2 = new Intent();
        intent2.putExtra("Demo2_1Activity", "I‘m Demo2_1Activity!!");
        //setResult(1);
        setResult(1, intent2);

    }

}

package com.ashzheng.studydemo.demo2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.ashzheng.studydemo.R;

public class Demo2_2Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2_2);

        Intent intent1 = getIntent();
        Log.d("demoinfo", "Demo2_2Activity收到:  " + intent1.getStringExtra("Demo2Activity"));

        Intent intent2 = new Intent();
        intent2.putExtra("Demo2_2Activity", "I‘m Demo2_2Activity!!");
        //setResult(2);
        setResult(2, intent2);
    }

}


参考《Android编程权威指南》

时间: 2024-08-25 23:18:19

Activity与Activity间的通信的相关文章

Android 使用AIDL实现进程间的通信

在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可,通过这种方式我们就可以完成进程间的通信工作.关于AIDL的编写规则我在这里就不多介绍了,读者可以到网上查找一下相关资料. 接下来,我就演示一个操作AIDL的最基本的流程. 首先,我

【转】使用AIDL实现进程间的通信之复杂类型传递

使用AIDL实现进程间的通信之复杂类型传递 首先要了解一下AIDL对Java类型的支持. 1.AIDL支持Java原始数据类型. 2.AIDL支持String和CharSequence. 3.AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要一个import语句,即使位于同一个包中. 4.AIDL支持传递实现了android.os.Parcelable接口的复杂类型,同样在引用这些类型时也需要import语句.(Parcelable接口告诉Android运行时在封送(marsha

新建线程与UI线程间的通信

现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入的数字,交给新建线程处理,线程计算质数后把结果传给UI线程,UI线程显示结果到显示框. XML如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android=&q

从AIDL开始谈Android进程间Binder通信机制

本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 我们知道,在Android app中的众多activity,service等组件可以运行在同一进程中,也可以运行在不同进程中.当组件运行在同一进程中进行通信就显得比较简单,在之前的Android线程间通信机制中已经讲过了:而当它们运行在不同的进程中时,就需要使用我们本文中所要介绍的Binder机制了. Binder作为一种进程间通信机制,负责提供远程调用的功能(RPC),

Android进程间的通信之AIDL

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL)来完成的.AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger.本文我们将学习如何创建AIDL文件实现Android进程间通信.在正式学习之前,我们先澄清一些"事实". 关于Android Service 1.Android服务不是后台任务

Android进程间的通信

1.概述:由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service.其中Activity可以跨进程调用其他应用程序的Activity:Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可

Fragment间的通信

在网上看到的一篇文章,总结的很好 为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的.有它自己的布局和行为的模块化组件.一旦你定义了这些可重用的Fragment,你就可以把它们跟一个Activity关联,并把它们跟应用程序的逻辑相连来实现全部的组合式UI. 现实中我们经常想要一个Fragment跟另一个Fragment进行通信,例如,要基于一个用户事件来改变内容.所有的Fragment间的通信都是通过跟关联的Activity来完成的.另个Fragment不应该直接通信

Handler不同线程间的通信

转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程(暂定为Thread-3)发起Socket连接.我们项目中使用mina作为socket通信框架,用过mina的同志们应该熟悉,Thread-3只是负责监听,具体的消息处理是另外的线程.在我们的IoHandler中处理消息,现在的问题是,我需要在IoHander的sessionOpened方法中给Act

Android进程间的通信之Messenger

Android进程间的通信方式可以通过以下两种方式完成: 1 Android接口定义语言(AIDL) 2 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. Android AIDL和Messenger区别 使用Messenger是执行进程间通信最简单的方法,因为Messenger会在单一线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计.而纯粹的AIDL接口会同时向服务发送多个请求,服务随后必须应对多线程处理.AIDL通常应用在服