Intent类

一、简介

Intent类是协调应用中四大组件通讯的,负责对应用中一次操作的动作、涉及的数据以及附加信息进行描述

.setAcition() 描述动作 .setData() 描述涉及的数据 .setType() 描述类型

二、引用Intent的方式

1、显示(直接)调用

通过指定的Activity的类名来显式引用Intent

①方法一

  public class Activity_Intent extends AppCompatActivity {
        Buttonb mToAnother_Activity_Btn;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_intent_layout);
            mToAnother_Activity_Btn = (Button) findViewById(R.id.toanother_activity_btn);
            //============显示调用=========
            mToAnother_Activity_Btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Intent intent=new Intent(Activity_Intent.this,Activity_Intent_Another.class);
				   startActivity(intent);
                }
            });

        }
    }

②方法二

   public class Activity_Intent extends AppCompatActivity {
        Buttonb mToAnother_Activity_Btn;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_intent_layout);
            mToAnother_Activity_Btn = (Button) findViewById(R.id.toanother_activity_btn);
            //============显示调用=========
            mToAnother_Activity_Btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setComponent(new ComponentName(Activity_Intent.this, Activity_Intent_Another.class));
                }
            });

        }
    }

2、隐式调用

方法一

通过隐式调用系统应用

public class Activity_Intent extends AppCompatActivity {
    Button mDialphone_Btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent_layout);
        mDialphone_Btn = (Button) findViewById(R.id.dialphone_btn);
        //==========隐式调用
        mDialphone_Btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                //==========调用系统拨号				
                intent.setAction(Intent.ACTION_DIAL);
                //intent.setAction(Intent.ACTION_CALL);
                //使用ACTION_CALL时,需要在AndroidManifest中添加相应的权限,如<use permission="android.permission.CALL_PHONE"
                Uri uri = Uri.parse("tel:123");
                intent.setData(uri);
                startActivity(intent);
            }
        });
    }
}

通过隐式调用媒体资源时,如音乐,要通过s.etDataAndType()同时获取资源位置和设置类型,若通过.setData();.setType();设置,则可能出现无法运行的情况。


②方法二:自定义Activity<action>属性隐式调用

第一步:在AndroidManifest.xml中对应的<activity></activity>中添加<action>和<category>属性

第二步:在当前Activity中添加相关操作的语句

public class Activity_Intent extends AppCompatActivity {
    Button mYs_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent_layout);
        mYs_btn = (Button) findViewById(R.id.ys_btn);
        mYs_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction("sjl.intent.aciton.Active");
                startActivity(intent);
            }
        });
    }
}

三、通过Intent在Activity之间传递参数

1、通过Intent传递基本数据类型、String类

{
	//=============CurrentActivity存入
	intent intent=new Intent();
	//intent.putExtra(String name,Object value);
	//存入Extra中,参数1 String name相当于key,values 可以为任何基本数据类型,也可以为String等
	intent.putExtra("KEY","CurrentActivity")
}

{
	//==============AnotherActivity取值
	Intent intent=getIntent();
	String key=intent.getString("KEY");
	//通过String name,获取相对应的值
}

2、通过Intent传递Bundle对象

mSendMsgByBundleBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle bundle = new Bundle();
                bundle.putString("NAME", mNameEdit.getText().toString());//放入Key为"NAME"的数据
                bundle.putString("BORN", mBornYearEdit.getText().toString());//放入Key为"BORN"的数据
                bundle.putString("ADDR", mAdressEdit.getText().toString());//放入Key为"ADDR"的数据
                bundle.putBoolean("SEX", sex);//放入Key为"SEX"的数据
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                intent.putExtra("BUNDLE", bundle);
                intent.putExtra("TYPE", 1);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                int requestCode = 193;
                startActivityForResult(intent, requestCode);
            }
        });

  public void recMsgByBundle(Intent intent) {
        //通过getIntent.getBundleExtra获取buunle实例,来保证bundle是传过来的bundle
        Bundle bundle = intent.getBundleExtra("BUNDLE");
        mRecName_Txt.setText(getResources().getString(R.string.name) + bundle.getString("NAME"));
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + bundle.getString("BORN"));
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + bundle.getString("ADDR"));
        mSex_Txt.setText(getResources().getString(R.string.sex) + (bundle.getBoolean("SEX") ? "男" : "女"));
    }

3、传递实现Serializable接口的类的对象

//===========类实现Serializable接口,通过Intent.putEtra()实现Activity之间传递对象
        mSendMsgBySer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                PersonMsgSer person = new PersonMsgSer();
                person.setName(mNameEdit.getText().toString());
                person.setBorn(mBornYearEdit.getText().toString());
                person.setAddr(mAdressEdit.getText().toString());
                person.setSex(sex);
                intent.putExtra("SER", person);
                intent.putExtra("TYPE", 2);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                int requestCode = 194;
                startActivityForResult(intent, requestCode);
            }
        });

public void recMsgBySer(Intent intent) {
        PersonMsgSer person = (PersonMsgSer) intent.getSerializableExtra("SER");
        mRecName_Txt.setText(getResources().getString(R.string.name) + person.getName());
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + person.getBorn());
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + person.getAddr());
        mSex_Txt.setText(getResources().getString(R.string.sex) + (person.isSex() ? "男" : "女"));
    }

4、传递实现Parcelable接口的类的对象

mSendMsgByPar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                //根据需要重载要传递的实现Percelable接口的类的构造方法
                PersonMsgPar person = new PersonMsgPar(mNameEdit.getText().toString(),
                        mBornYearEdit.getText().toString(), mAdressEdit.getText().toString(), sex);
                intent.putExtra("PAR", person);
                intent.putExtra("TYPE", 3);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                Log.v("Par", mNameEdit.getText().toString() + "," + mBornYearEdit.getText().toString() + "," + mAdressEdit.getText().toString());
                int requestCode = 195;
                startActivityForResult(intent, requestCode);
            }
        });
public void recMsgByPar(Intent intent) {
        PersonMsgPar person = intent.getParcelableExtra("PAR");
        mRecName_Txt.setText(getResources().getString(R.string.name) + person.getName());
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + person.getBorn());
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + person.getAddr());
        mSex_Txt.setText(getResources().getString(R.string.sex) + (person.isSex() ? "男" : "女"));
    }

四、Activity参数的回传(回传值)

1、跳转Activity时,语句使用startActivityForResult(),并且重写当前Activity的onActivityResult()方法;

2、跳转到的Activity中使用setResult()语句

下面是一个具体的Demo:

public class EnteringMessageActivity extends AppCompatActivity {
    Button mSendMessageBtn, mSendMsgByBundleBtn, mSendMsgBySer, mSendMsgByPar;
    TextView mShowReturnValue;
    EditText mNameEdit, mBornYearEdit, mAdressEdit;
    String[] message = new String[3];
    RadioGroup sexRadio;
    boolean sex = true;
    int number = 1;//判断生日日期输入框文本是增加还是减少

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_entering_message_layout);
        mSendMessageBtn = (Button) findViewById(R.id.sendmessage_btn);
        mNameEdit = (EditText) findViewById(R.id.name_et);
        mBornYearEdit = (EditText) findViewById(R.id.born_year_et);
        mAdressEdit = (EditText) findViewById(R.id.address_et);
        sexRadio = (RadioGroup) findViewById(R.id.sex_radio);
        mSendMsgByBundleBtn = (Button) findViewById(R.id.sendmessagebybundle_btn);
        mSendMsgBySer = (Button) findViewById(R.id.sendmessagebyser_btn);
        mSendMsgByPar = (Button) findViewById(R.id.sendmessagebypar_btn);
        mShowReturnValue = (TextView) findViewById(R.id.show_return_txt);
        //=============传递"SEX"信息,若sex为true则为“男性”,反之“女性”
        sexRadio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.man_radio:
                        sex = true;
                        break;
                    case R.id.woman_radio:
                        sex = false;
                        break;
                }
            }
        });
        //===========通过Intent实现Activity之间的信息传递
        mSendMessageBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("scxh.intent.action.ReceiveMag");//通过自定义的action属性隐师调用
                message[0] = mNameEdit.getText().toString();
                message[1] = mBornYearEdit.getText().toString();
                message[2] = mAdressEdit.getText().toString();
                //  Log.v("输入的姓名", message[0]);
                System.out.println("输入的姓名:" + message[0]);
                //  Log.v("输入的出生日期", message[1]);
                // Log.v("输入的地址", message[2]);
                intent.putExtra("MESSAGE", message);
                intent.putExtra("SEX", sex);
                intent.putExtra("TYPE", 0);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                int requestCode = 192;
                startActivityForResult(intent, requestCode);
            }
        });
        //===============通过Bundle实现Activity之间的信息传递,传递Bundle对象
        mSendMsgByBundleBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle bundle = new Bundle();
                bundle.putString("NAME", mNameEdit.getText().toString());
                bundle.putString("BORN", mBornYearEdit.getText().toString());
                bundle.putString("ADDR", mAdressEdit.getText().toString());
                bundle.putBoolean("SEX", sex);
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                intent.putExtra("BUNDLE", bundle);
                intent.putExtra("TYPE", 1);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                int requestCode = 193;
                startActivityForResult(intent, requestCode);
            }
        });
        //===========类实现Serializable接口,通过Intent.putEtra()实现Activity之间传递对象
        mSendMsgBySer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                PersonMsgSer person = new PersonMsgSer();
                person.setName(mNameEdit.getText().toString());
                person.setBorn(mBornYearEdit.getText().toString());
                person.setAddr(mAdressEdit.getText().toString());
                person.setSex(sex);
                intent.putExtra("SER", person);
                intent.putExtra("TYPE", 2);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                int requestCode = 194;
                startActivityForResult(intent, requestCode);
            }
        });
        //===========类实现Parcelable接口,通过Intent.putEtra()实现Activity之间传递对象
        mSendMsgByPar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(EnteringMessageActivity.this, ReceiveMessageActivity.class);
                //根据需要重载要传递的实现Percelable接口的类的构造方法
                PersonMsgPar person = new PersonMsgPar(mNameEdit.getText().toString(),
                        mBornYearEdit.getText().toString(), mAdressEdit.getText().toString(), sex);
                intent.putExtra("PAR", person);
                intent.putExtra("TYPE", 3);//传入int参数,使ReceiveMessageActivity根据这个参数判断调用什么方法
                Log.v("Par", mNameEdit.getText().toString() + "," + mBornYearEdit.getText().toString() + "," + mAdressEdit.getText().toString());
                int requestCode = 195;
                startActivityForResult(intent, requestCode);
            }
        });
        mBornYearEdit.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.v("测试输入前", "start:" + start + ",after:" + after);
                number = after;//若字符串长度增加,则after为1;反之为0
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.v("测试输入中", "start:" + start + ",before:" + before);
            }

            @Override
            public void afterTextChanged(Editable s) {
                String ymd = mBornYearEdit.getText().toString();
                //-------------输入前四位数字的时候自动添加"年",第七位添加"月",,第十位添加"日"
                if (number == 1 && s.length() == 4) {
                    mBornYearEdit.setText(ymd + "年");
                    Selection.setSelection((Spannable) mBornYearEdit.getText(), s.length() + 1);
                } else if (number == 1 && s.length() == 7) {
                    mBornYearEdit.setText(ymd + "月");
                    Selection.setSelection((Spannable) mBornYearEdit.getText(), s.length() + 1);
                } else if (number == 1 && s.length() == 10) {
                    mBornYearEdit.setText(ymd + "日");
                    Selection.setSelection((Spannable) mBornYearEdit.getText(), s.length() + 1);
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        String obj = null;
        switch (requestCode) {
            case 192:
                obj = "Intent";
                break;
            case 193:
                obj = "Bundle";
                break;
            case 194:
                obj = "Serializable";
                break;
            case 195:
                obj = "Parcelable";
                break;
        }
        Log.v("标签1", obj);
        if (data == null) {
            mShowReturnValue.setText("暂无内容");
        } else {
            mShowReturnValue.setText(obj + "\r\n用户信息:\r\n" + data.getStringExtra("RECNAME") + "\r\n" + data.getStringExtra("RECBORN") + "\r\n" +
                    data.getStringExtra("RECADDR") + "\r\n" + data.getStringExtra("RECSEX"));
        }
    }
}

public class ReceiveMessageActivity extends AppCompatActivity {
    TextView mRecName_Txt, mRecYear_Txt, mRecAddress_Txt, mSex_Txt;
    Button mSaveBtn, mCancelBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive_message_layout);
        mRecName_Txt = (TextView) findViewById(R.id.rec_name_txt);
        mRecYear_Txt = (TextView) findViewById(R.id.rec_year_txt);
        mRecAddress_Txt = (TextView) findViewById(R.id.rec_address_txt);
        mSex_Txt = (TextView) findViewById(R.id.rec_sex_txt);
        mSaveBtn = (Button) findViewById(R.id.rec_save_btn);
        mCancelBtn = (Button) findViewById(R.id.rec_cancel_btn);
        Intent intent = getIntent();
        switch (intent.getIntExtra("TYPE", 0)) {
            case 0:
                recMsgByIntent(intent);
                break;
            case 1:
                recMsgByBundle(intent);
                break;
            case 2:
                recMsgBySer(intent);
                break;
            case 3:
                recMsgByPar(intent);
                break;
        }
        mSaveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = getIntent();
                int resultCode = 100;
                intent.putExtra("RECNAME", mRecName_Txt.getText().toString());
                intent.putExtra("RECBORN", mRecYear_Txt.getText().toString());
                intent.putExtra("RECADDR", mRecAddress_Txt.getText().toString());
                intent.putExtra("RECSEX", mSex_Txt.getText().toString());
                setResult(resultCode, intent);
                finish();
            }
        });
        mCancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    public void recMsgByIntent(Intent intent) {
        mRecName_Txt.setText(getResources().getString(R.string.name) + intent.getStringArrayExtra("MESSAGE")[0]);
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + intent.getStringArrayExtra("MESSAGE")[1]);
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + intent.getStringArrayExtra("MESSAGE")[2]);
        mSex_Txt.setText(getResources().getString(R.string.sex) + (intent.getBooleanExtra("SEX", true) ? "男" : "女"));
    }

    public void recMsgByBundle(Intent intent) {
        //通过getIntent.getBundleExtra获取buunle实例,来保证bundle是传过来的bundle
        Bundle bundle = intent.getBundleExtra("BUNDLE");
        mRecName_Txt.setText(getResources().getString(R.string.name) + bundle.getString("NAME"));
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + bundle.getString("BORN"));
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + bundle.getString("ADDR"));
        mSex_Txt.setText(getResources().getString(R.string.sex) + (bundle.getBoolean("SEX") ? "男" : "女"));
    }

    public void recMsgBySer(Intent intent) {
        PersonMsgSer person = (PersonMsgSer) intent.getSerializableExtra("SER");
        mRecName_Txt.setText(getResources().getString(R.string.name) + person.getName());
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + person.getBorn());
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + person.getAddr());
        mSex_Txt.setText(getResources().getString(R.string.sex) + (person.isSex() ? "男" : "女"));
    }

    public void recMsgByPar(Intent intent) {
        PersonMsgPar person = intent.getParcelableExtra("PAR");
        mRecName_Txt.setText(getResources().getString(R.string.name) + person.getName());
        mRecYear_Txt.setText(getResources().getString(R.string.bornyear) + person.getBorn());
        mRecAddress_Txt.setText(getResources().getString(R.string.address) + person.getAddr());
        mSex_Txt.setText(getResources().getString(R.string.sex) + (person.isSex() ? "男" : "女"));
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值