【Android基础】利用Intent在Activity之间传递数据

前言:

上一篇文章给大家聊了Intent的使用方法。怎样用Intent启动Activity和隐式Intent。这一篇文章给大家聊聊怎样利用Intent在Activity之间进行沟通。

从一个Activity获取返回结果:

启动一个Activity不不过startActivity(Intent intent)一种方法。你也能够通过startActivityForResult()启动一个Activity而且在它退出的时候收到一个返回结果。

比方。你能够调用系统相机在你的应用中,拍了一张照片,然后返回到你的Activity,这个时候就能够通过这样的方法把照片作为结果返回给你的Activity。

再比方。你能够通过这样的方法启动系统联系人应用,然后获取一个人的具体联系方式。

注意:在调用startActivityForResult()时你可以利用显示Intent或者隐式Intent。可是在你可以利用显式Intent的时候尽量利用显式Intent。这样可以保证返回的结果是你期待的正确结果。

启动一个Activity:

在用startActivityForResult()来启动一个Activity时,Intent的写法与startActivity()是一样的,没有不论什么差别。仅仅是你须要传递一个额外的Integer的变量作为启动參数。当启动的那个Activity退出时这个參数会被作为回调函数的一个參数,用来区分返回结果。也就是说你启动Activity时传递的參数(requestCode)和返回结果时的那个參数(requestCode)是一致的。

以下是一个调用startActivityForResult()获取联系人的样例:

static final int PICK_CONTACT_REQUEST = 1;  // The request code
... 
private void pickContact() { 
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

startActivityForResult()函数在Activity源代码中是这种:

 /**
     * Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
     * with no options.
     *
     * @param intent The intent to start.
     * @param requestCode If >= 0, this code will be returned in
     *                    onActivityResult() when the activity exits.
     *
     * @throws android.content.ActivityNotFoundException
     *
     * @see #startActivity
     */
    public void startActivityForResult(Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }

这种方法在Activity中进行了重载。startActivityForResult(intent, requestCode, null);方法就不贴出来了。

可是对于这种方法使用时的注意事项我给大家翻译一下:

  • 这种方法仅仅能用来启动一个带有返回结果的Activity,Intent的參数设定须要注意一下。你不能启动一个Activity使用singleTask的launch mode,用singleTask启动Activity,那个Activity在另外的一个Activity栈中,你会立马收到RESULT_CANCELED消息。
  • 不能在Activity生命周期函数onResume之前调用startActivityForResult()方法,假设你在onResume之前调用了。那么所在的Activity就无法显示,直到启动的那个Activity退出然后返回结果,这是为了避免在又一次定向到另外Activity时窗体闪烁;

接收返回结果:

当startActivityForResult()启动的Activity完毕任务退出时,系统会回调你调用Activity的onActivityResult()方法。这种方法有三个參数:

  • resquestCode : 启动Activity时传递的requestCode。
  • resultCode: 表示调用成功或者失败的变量,值为以下二者之中的一个;

        /** Standard activity result: operation canceled. */

    public static final int RESULT_CANCELED    = 0;

    /** Standard activity result: operation succeeded. */

    public static final int RESULT_OK           = -1;

  • Intent:包括返回内容的Intent;

以下的代码是处理获取联系人结果的样例:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we‘re responding to 
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful 
        if (resultCode == RESULT_OK) {
            // The user picked a contact. 
            // The Intent‘s data Uri identifies which contact was selected. 
 
            // Do something with the contact here (bigger example below) 
        } 
    } 
}

注意:为了正确的处理返回的Intent结果,你须要清楚的了解Intent返回结果的格式。假设是你自己写的Intent作为返回结果你会非常清楚,可是假设是调用的系统APP(相机。联系人等),那么Intent返回结果格式你应该清楚的知道。

比方:联系人应用是返回的联系人URI。相机返回的是Bitmap数据。

处理返回结果:

以下的代码是怎样处理获取联系人的结果:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we‘re responding to 
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful 
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact 
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result 
            String[] projection = {Phone.NUMBER};
 
            // Perform the query on the contact to get the NUMBER column 
            // We don‘t need a selection or sort order (there‘s only one result for the given URI) 
            // CAUTION: The query() method should be called from a separate thread to avoid blocking 
            // your app‘s UI thread. (For simplicity of the sample, this code doesn‘t do that.) 
            // Consider using CursorLoader to perform the query. 
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();
 
            // Retrieve the phone number from the NUMBER column 
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);
 
            // Do something with the phone number... 
        } 
    } 
}

以下的代码是处理调用系统相机返回的结果:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        mImageView.setImageBitmap(imageBitmap);
    } 
}

获取启动Intent:

在被启动的Activity中你能够接收启动这个Activity的Intent,在生命周期范围内都能调用getIntent()来获取这个Intent,可是一般都是在onCreat和onStart函数中获取。以下就是一个获取Intent的样例:

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    setContentView(R.layout.main);
 
    // Get the intent that started this activity 
    Intent intent = getIntent();
    Uri data = intent.getData();
 
    // Figure out what to do based on the intent type 
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ... 
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ... 
    } 
}

设置返回Intent:

上面介绍了怎么在onActivityResult()中处理Intent。可是怎么在你的应用中设置这个返回Intent呢?假设你想给调用你的Activity返回一个结果能够通过调用setResult()设置返回内容,然后结束这个Activity。

以下的代码是一个演示样例:

// Create intent to deliver some kind of result data 
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();

以上就是使用Intent在不同Activity进行信息传递和沟通的解说,到此Intent系列文章完结。前两篇文章是关于Intent具体解释Intent使用的文章。有什么不明确的请留言,大家共同学习。共同进步,谢谢。

大家假设对编程感兴趣,想了解很多其它的编程知识,解决编程问题,想要系统学习某一种开发知识,我们这里有java高手。C++/C高 手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序猿互动联盟or coder_online。大牛在线为您提供服务。

时间: 2024-09-10 14:44:20

【Android基础】利用Intent在Activity之间传递数据的相关文章

android中使用Intent在activity之间传递数据

android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivity.this,OtherActivity.class); intent.putExtra("name", "使用Intent传递数据"); startActivity(intent); 然后再目标activity中接收数据: Intent intent=getInten

Android中在两个Activity之间进行数据传递

首先声明,此篇文章是我原先的CSDN上面的博客,由于种种原因,不想再使用csdn博客,于是就将其文章搬至现在的cnblog. 大家好,今天我终于开通了自己的博客,很开心能和大家共同分享我的学习经验,希望我们可以共同进步哦,废话不多说了,看一下我今天学习android遇到的一些问题和解决办法吧 首先先把我使用的eclipse的版本贴出来:adt-bundle-windows-x86-20130917 这是一个集成的版本,不需要配置SDK和ADT,但是需要手动配置JDK哦! 其实,不同版本的ecli

Android 笔记-Fragment 与 Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

Android笔记Fragment与Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

Activity之间传递数据的方式及常见问题总结

转载请注明:大飞 http://blog.csdn.net/rflyee/article/details/47431633 Activity之间传递数据一般通过以下几种方式实现: 1. 通过intent传递数据 2. 通过Application 3. 使用单例 4. 静态成员变量.(可以考虑 WeakReferences) 5. 持久化(sqlite.share preference.file等) 一.通过intent传递数据 (1)直接传递,intent.putExtra(key, value

Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

http://blog.csdn.net/cjjky/article/details/6441104 在Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中的Object要实现Parcelable接口.下面我们以一个完整的例子来说明. 1.新建一个A

Android基础 -- Activity之间传递数据(bitmap和map对象)

原文:http://blog.csdn.net/xueerfei008/article/details/23046341 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符串之类的东东,结果这次卡了好久,折腾了一个下午. 第一个:传递bitmap 这个问题非常奇葩(可能我android水平还不够),居然不会报错,我是直接用bundle或Intent的extral域直接存放bitmap,结果运行时各种宕机,各种界面乱窜(我非常的纳闷)...搜索之后看大家都说不能直接传递

Android中Intent在Activity之间传递对象[Serializable或Parcelable]

使用intent启动activity /** * Serializeable传递对象的方法 */ private void SerializeMethod(){ Person mPerson = new Person(); mPerson.setName("andy"); mPerson.setAge(26); Intent mIntent = new Intent(this,SerializableDemo.class); Bundle mBundle = new Bundle();

利用Bundle在activity之间传递对象

(2010-12-04 09:45:54) 转载▼ 标签: it 分类: android开发 转自:http://chen592969029.javaeye.com/blog/772656 假如需要在两个activity间传递数据,我们通常都是用Bundle,但是里面似乎只有一些放置一些Java中已经有的数据类型,像String,int,double等,但如果要传递一个对象呢?不难发现Bundle中有一个方法putSerializable,利用该对象就可以传递对象了,不过传递的对象要实现Seri