精华内容
下载资源
问答
  • 在学习android时候发现Activity之间传递数据是比较复杂的,在Activity中调用另一个Activity时,需要调用startActivity(Intent i), 若需要在调用另外一个Activity的同时传递数据,那么就需要利用android.os.Bundle...

    在学习android时候发现Activity之间传递数据是比较复杂的,在Activity中调用另一个Activity时,需要调用startActivity(Intent i), 若需要在调用另外一个Activity的同时传递数据,那么就需要利用android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。Bundle对象针对了不同的数据类型提供了许多的方法,例如,传递String类型的数据,使用的方法为Bundle.putString(stringName,stringValue):

    看看书和网上的资料总结了一下传递的过程

    简单的传递数据实现

    1.新建一个project

    2.在这个Activity里添加一个Button

    3、创建另一个Activity,添加一个textview并且设置好id

    4.MainActivity中代码如下

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //创建并实现一个监听器
    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //监听器运作
    Intent i=new Intent(MainActivity.this,Main2Activity.class);//MainActivity和Main2Ativity连接起来
    i.putExtra("data","nihao");//用putExtra把内容传送到另一个Activity,名字是data,值是nihao
    startActivity(i);//启动第二个activity

    }
    });
    }
    }

    在Mian2Activity代码如下

    public class Main2Activity extends AppCompatActivity {
    private TextView tv;

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

    Intent i=getIntent();
    tv=(TextView) findViewById(R.id.tv22);
    tv.setText(i.getStringExtra("data"));
    }
    }

    展开全文
  • 在通过Intent启动新的Activity时,经常需要向目标Activity传递数据。从形式上来看通过Intent启动Activity时传递数据有两种方式,一是显示的将数据放入bundle中,然后将bundle放入intent中;二是将数据直接放入Intent...

    1.简介
    在通过Intent启动新的Activity时,经常需要向目标Activity传递数据。从形式上来看通过Intent启动Activity时传递数据有两种方式,一是显示的将数据放入bundle中,然后将bundle放入intent中;二是将数据直接放入Intent中。下面通过示例来展示这两种数据的传递方式,并且从Android源码分析,这两种方式的本质是一样的,即都是通过Bundle来存取数据的。

    2.1.通过Bundle传递数据
    两个Activity,从MainActivity中将数据传递到SecondActivity,数据类型有字符串、整形、布尔型三种。MainActivity的代码如下:

        private final static String NAME_KEY = "name";
        private final static String AGE_KEY = "age";
        private final static String IS_FEMALE_KEY = "isfemale";
        Intent intent = new Intent(MainActivity.this,SecondActivity.class);
        Bundle data = new Bundle();
        data.putString(NAME_KEY,"zhangsan");//将数据放入bundle
        data.putInt(AGE_KEY,25);
        data.putBoolean(IS_FEMALE_KEY,true);
        intent.putExtras(data);
    
        //在SecondActivity中,将传递的数据取出
        Bundle data = getIntent().getExtras();//从bundle中取出数据
        String name = data.getString(MainActivity.NAME_KEY);
        int age = data.getInt(MainActivity.AGE_KEY);
        boolean isfemale = data.getBoolean(MainActivity.IS_FEMALE_KEY);
        Log.d(LOG_TAG,"name = "+name);
        Log.d(LOG_TAG,"age = "+age);
        Log.d(LOG_TAG,"isfemale = "+isfemale);
    

    Bundle可以传递序列化对象,其方法是putSerializable(String key, Serializable value),putParcelable(String key, Parcelable value),分别可以传递实现了Serializable和Parcelb接口的对象,我比较倾向于通过这种方式传递数据,其使用方式如下:

        //存入数据
        Person person = new Person();//Person是一个JavaBean,实现了Serializable接口
        person.setName("lisi");//设置相应的属性值
        person.setAge(27);
        person.setIsfemale(true);
        mIntent.putExtra(PERSON_KEY,person);
    
        //取出数据
        Bundle data = intent.getExtras();
        Person person = (Person) data.getSerializable(MainActivity.PERSON_KEY);
        Log.d(LOG_TAG,"name = "+person.getName());
        Log.d(LOG_TAG,"age = "+person.getAge());
        Log.d(LOG_TAG,"isfemale = "+person.isfemale());
    

    2.2.省略bundle直接把数据放入Intent
    //在MainActivity中存入数据:
    intent.putExtra(NAME_KEY,”zhangsan”);
    intent.putExtra(AGE_KEY,25);
    intent.putExtra(IS_FEMALE_KEY,false);

        //在SecondActivity中取出数据:
        Intent intent = getIntent();
        String name = intent.getStringExtra(MainActivity.NAME_KEY);
        int age = intent.getIntExtra(MainActivity.AGE_KEY,30);
        boolean isfemale = intent.getBooleanExtra(MainActivity.IS_FEMALE_KEY,true);
    

    同样,通过Intent也可传递序列化对象,使用方式和Bundle的类似。

    3.两种数据传递方式的联系
    通过intent或者bundle传递数据,其本质都是通过bundle传递,可以通过以下方式验证:在MainActivity中将数据直接放入intent中,在SecondActivity中先通过intent.getExtras()取出bundle,然后通过bundle的方法同样可以取出相应的数据。
    从Android源码来看,比如将String类型的value通过Intent的putExtra()方法放入Intent,其本质是放入到了mExtras中,而mExtras为Bundle类型。如果mExtras不是null,则将数据放入mExtras中,否则自动新建一个并存入数据。而在取数据时,getStringExtra(String name)也是通过bundle获取数据的,相关源码如下:

        //Intent的putExtra(String, String)方法
        public Intent putExtra(String name, String value) {
                if (mExtras == null) {
                        mExtras = new Bundle();//如果mExtras为null则直接new一个Bundle
                 }
                mExtras.putString(name, value);//否则,将数据存入mExtras
                return this;
         }
    
        //Intent的getStringExtra()方法
        public String getStringExtra(String name) {    
                return mExtras == null ? null : mExtras.getString(name);//通过mExtras取出数据
        }
    

    4.Bundle是如何存取数据的?
    Bundle是通过ArrayMap来存取数据的。

        //Bundle的putString()方法
        public void putString( String key, String value) {
                unparcel();
                mMap.put(key, value);//mMap的类型是ArrayMap
        }
    
        //Bundle的getString()方法
        public String getString(String key) {
                ....
                final Object o = mMap.get(key);
                ....                
                return (String) o;
                ....    
        }
    

    文/启才(简书作者)
    原文链接:http://www.jianshu.com/p/a17313dd19da
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    展开全文
  • 1.Activity之间设置点击按钮传递数据,首先需要创建两个activity页面,然后在MainActivity里面配置点击事件和intent, 关键的是intent中的方法putExtra(“key值”,“字符串”) public class MainActivity extends ...

    1.Activity之间设置点击按钮传递数据,首先需要创建两个activity页面,然后在MainActivity里面配置点击事件和intent,
    关键的是intent中的方法putExtra(“key值”,“字符串”)
    public class MainActivity extends AppCompatActivity{
    private Button btn;
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn=findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent=new Intent();
    intent.setClass(MainActivity.this,Main22Activity.class);
    intent.putExtra(“data”,“哈哈哈”);
    startActivity(intent);
    }
    });

    }
    

    2.配置第二个Activity页面,将intent传过来的参数赋值给bundle,然后将bundle的值赋值给String data,然后Log.d打印出来,log里面的信息中第一个是tag信号是Main22Activity,第二个是key值即为变量值,然后运行就会在Logcat 中显示出来。下面是第二个Activity的代码。
    public class Main22Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main22);
        Bundle bundle=getIntent().getExtras();
        String data=bundle.getString("data");
        Log.d("Main22Activity", data);
    }
    

    }

    3.然后配置Logcat Filter 信号筛选器,其中Filter Name是tag信号的名称,和下面的Log Tag相同,然后最后的Log level是需要显示信号的等级,因为在第二个代码中Log.d 其中的d代表的就是Debug,然后筛选出来的就是Debug信号
    在这里插入图片描述
    4.最后在控制台的log Cat中就会显示从第一个Activity中传递过来的String变量值。

    展开全文
  • Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast。 组件名称 方法名称 Activity startActivity() startActivityForResult()

    1.Intent和Bundle

     Intent可以理解为不同组件通信的媒介或者信使

    Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast。

    组件名称

    方法名称

    Activity

    startActivity()

    startActivityForResult()

    Service

    startService()

    bindService()

    Broadcasts

    sendBroadcast()

    sendOrderedBroadcast()

    sendStickyBroadcast()

    Intent对象由以下六个部分组成:

      Component name

      Action

      Data

      Category

      Extras

      Flags

    范例
    (1)新建一个bundle类
           Bundle mBundle = new Bundle();   

    (2)bundle类中加入数据(key -value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value)
           mBundle.putString("Data", "data from TestBundle");  
    (3)新建一个intent对象,并将该bundle加入这个intent对象
         Intent intent = new Intent();     
         intent.setClass(TestBundle.this, Target.class);    
         Bundle mBundle = new Bundle();    
         mBundle.putString("Data", "data from TestBundle");//压入数据     
         intent.putExtras(mBundle);    
         startActivity(intent);  
    (4)
         Bundle bundle = getIntent().getExtras();//得到传过来的bundle   
         String data = bundle.getString("Data");//读出数据    


    2.运用startActivityForResult()

    请求码和结果码

    请求码的作用
    startActivityForResult(Intent intent, int requestCode)的第二个参数为请求码。
    请求码的值是根据业务需要由自已设定,用于标识请求来源
    例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。这个时候,我们就需要判断是按钮打开了Activity,我们可以这样做
    首先,在startActivityForResult时候设置请求码的数值

    button1.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                    startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);

               }

            });
    button2.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v) {
                     startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);

                }

            });

    接着,在onActivityResult中判断请求码做出不同的操作:

    @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(requestCode){
                       case 1:
                       //来自按钮1的请求,作相应业务处理
                       case 2:
                       //来自按钮2的请求,作相应业务处理
                    }
              }

    结果码的作用:

    在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):

    public class ResultActivity extends Activity {
           .....
           ResultActivity.this.setResult(1, intent);
           ResultActivity.this.finish();
    }
    public class NewActivity extends Activity {
           ......
            NewActivity.this.setResult(2, intent);
            NewActivity.this.finish();
    }
    public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
           @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   switch(resultCode){
                       case 1:
                       // ResultActivity的返回数据
                       case 2:
                        // NewActivity的返回数据
                    }
              }

    3.重载onActivityResult

    如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
    展开全文
  • 安卓Service向Activity传递数据,更新UI

    千次阅读 2016-09-07 16:24:52
    1服务:执行定时任务,发起网络请求定位,请求到的结果传递到活动,在地图上展示。2活动关键代码: 绑定服务后会获取LocationService.LocationBinder对象,在此处调用getLocationService()方法获取Service实例,...
  • 安卓开发-Activity数据传递和回传
  • 2.跳转之后将所点击项目的值(此处为“oppo”)传给相应Activity(此处为SortSearchActivity),实现搜索并将商品详情显示出来。 具体实现效果如下图所示(点击oppo): 1.如何解决界面跳转问题,通过Context实现...
  • 显式Intent来跳转页面和传递数据: Intent intent=new Intent(MainActivity.this,ReceiverActivity.class); intent.putExtra("显式数据","显示意图Intent传送数据"); startActivity(intent); 接受数据时: TextView...
  • 1.通过intent传递数据 通过Intent传递方法核心就是通过putEntry来传递方法。 传递代码: intent.putExtra("KEY_HELLO","helloword"); 接受代码: Intent intent=getIntent(); String value=intent....
  • 在要传递Activity Intent intent=new Intent();  intent.setClass(WriteToTagNameActivity.this, WriteTagHint.class);//从一个activity跳转到另一个activity  intent.putExtra("cardid
  • 现在看看怎么从fragment向activity传递数据。 比如说,我们在一个ViewPage里面设置了若干个fragment,fragment里面有一个按钮,提交相关当前fg下标给viewPage所在的activity,删除当前的fg。 这里使用了handler,...
  • 使用Bundle传递数据的跳转 Bundle类 示例 直接使用Intent传递数据 示例 得到新Activity关闭后的数据 示例 intent实现普通跳转 使用intent的setclass方法,示例(由此界面跳转到NewAct
  • 如果我在View里用Context接收数据的话,那么Activity中以什么方式发送数据?是以Intent还是写一个构造方法? 能不能具体说一下,在这方面学习一下,网上讲的云里雾里的,都不太懂,具体最好,谢谢了!
  • ///获取前面的那个activity传过来的数据  v1.setText(bundle.getString("str1"));//用textview显示。  v2.setText(bundle.getString("str2")); 参考博客: http://ant-qingyun27sc.iteye.com/blog/1589812 ...
  • 安卓开发-Activity之间的数据传递 开发环境:MacbookPro Catalina + Android Studio 3.5.3 1. 明确实现思路 创建两个Activity,名称分别为MainActivity和MainActivity2, 在MainActivity中添加一个输入框、一个按钮、...
  • 安卓数据传递

    2018-04-01 14:40:32
    A activity打开B ...B关闭把数据传给A B activity Intent intent = new Intent(); setResult(100,intent); A activity (A 打开 B startActivityForResult(intent,100);) @Override protected void onActi...
  • 背景:作业里边有一题,要求为物理按键——返回键,实现...于是先在网上搜索,Android 按返回键怎么传递数据? 网上的描述都很简单,寥寥几行代码。主要有两种方法。 方法一:重写返回键方法 public boolean onKe...
  • 安卓Activity间信息传递方式有很多,这里我们实现利用intent传递extra信息这种方式 Intent简介 众所周知,安卓一个Activity打开另一个Activity最简单方法是使用startActivity(Intent),参数Intent是component用来与...
  • 零、前言 打开FromActivity,通过按钮以返回结果方式打开ToActivity,同时在intent中加入数据, 在To... 按返回按钮,将ToActivity数据传递给FromActivity,在onActivityResult方法中验证返回结果并将数据填充...
  • 此文主要还是针对刚开始接触...第一个Activity package com.example.jsontext; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import androi
  • 在这里我要说明的是用intent和全局变量的方法jiagn 1使用intent传递数据

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 295
精华内容 118
关键字:

安卓activity传递数据