Intent基本用法

Intent基本用法

Intent是四大组件(Activity、Service、Broadcast Receiver、Content Provider)的纽带,它解决了Android应用各项组件的通信,它使得调用者与被调用者之间解耦。
Intent的主要属性有action、data,另外还有category、type、component、extras
值得注意的是:

  • 当隐式调用Intent时,将使用action、type、category来推断合理的组件启动。
  • type是一个MIME类型,可以通过data推断出来,如果显式指出,则会禁止推断。
  • 当指定了component属性时(显式调用Intent),其他属性都是可选的,也不会启用推断。
  • data不是指传递的信息,而是Urischeme(如http:mailto:)。
  • 可以使用extras传递Bundle对象来传递信息。

Demo地址:https://github.com/Getnway/IntentDemo

显式和隐式调用

显式调用(Explicit Intents)是指通过setComponent(ComponentName)setClass(Context, Class)来指定组件(component)的调用Intent方式。如在MainActivity.java中:

mBtnA.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {   
        //显示Intent
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, AActivity.class);
        startActivity(intent);
    }
});

隐式调用(Implicit Intents )即不明确指定组件,而是靠Intent参数来推断出适合的组件。如:
AndroidManifest.xml中添加了BActivity

<activity
    android:name=".BActivity"
    android:label="BActivity" >
    <intent-filter>
        <action android:name="com.luojiawei.intentdemo.action.B_ACTIVITY"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

则可以在MainActivity.java通过以下代码来启动BActivity

mBtnB.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //隐式Intent
        Intent intent = new Intent();
        intent.setAction("com.luojiawei.intentdemo.action.B_ACTIVITY");
        intent.addCategory("android.intent.category.DEFAULT");
        startActivity(intent);
    }
});

学会使用隐式Intent后,我们就可以使用它来调用系统应用或其他应用,如:
打电话:

mBtnPhone.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //拨打电话10086
        Intent intent = new Intent();
        intent.setAction("android.intent.action.DIAL");
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }
});

回到主界面:

mBtnHome.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //隐式Intent
        Intent intent = new Intent();
        intent.setAction("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.HOME");
        startActivity(intent);
    }
});

通过Intent传递数据

向下一个活动传递数据
要通过Intent传递数据,则要使用Intent的另一个属性extras,可以通过调用putExtra()重载方法来实现。如在MainActivity.java中:

mBtnA.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String data = "message_from_MainActivity";//待传送信息
        //显式Intent
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, AActivity.class);
        intent.putExtra("my_data", data);//第一个参数为键值
        startActivityForResult(intent, REQUEST_CODE);
    }
});

AActivity.java中获取数据:

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

    Intent intent = getIntent();
    String data = intent.getStringExtra("my_data");
    mTextView = (TextView)findViewById(R.id.text_view);
    mTextView.setText(data);

}

返回数据给上一个活动
要想返回数据给上一个活动,只要将原来的启动Activity代码startActivity(Intent intent)换为startActivityForResult(Intent intent, int requestCode)并重写方法onActivityResult(int requestCode, int resultCode, Intent data)即可。
MainActivity.java中:

mBtnA.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //显式Intent
        Intent intent = new Intent();
        startActivityForResult(intent, REQUEST_CODE);
    }
});

并且重载onActivityResult()方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode,resultCode,data);
    switch (requestCode){
        case REQUEST_CODE:  //处理AActivity返回的数据
            if(resultCode == Activity.RESULT_OK){
                String returnData = data.getStringExtra("return_data");
                mTextView.setText(returnData);
            }
            break;
        default:
            break;
    }
}

AActivity.java中:

//按下返回键,传递信息给上一个Activity
@Override
public void onBackPressed(){
    String retrunData = "return_message_from_AActivity";
    Intent intentReturn = new Intent();
    intentReturn.putExtra("return_data", retrunData);
    setResult(Activity.RESULT_OK, intentReturn);
    finish();
}

Intent的更多应用

获取联系人

监听按钮

mBtnContact.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //获取联系人
        Intent intent = new Intent();
        intent.setAction("android.intent.action.GET_CONTENT");
        intent.setType("vnd.android.cursor.item/phone");
        startActivityForResult(intent, PICK_CONTACT);
    }
});

重载onActivityForResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode,resultCode,data);
    switch (requestCode){
        case PICK_CONTACT:  //显示联系人姓名和号码
            if(resultCode == Activity.RESULT_OK){
                CursorLoader cursorLoader = new CursorLoader(MainActivity.this,data.getData(), null, null, null, null);
                Cursor cursor = cursorLoader.loadInBackground();
                if(cursor != null && cursor.moveToFirst()){
                    String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
                    String number = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.NUMBER));
                    mTextView.setText(name + " " + number);
                }else{
                    mTextView.setText("请选择一个联系人");
                }
            }
            break;
        default:
            break;
    }
}

获取相册照片

监听按钮

mBtnPhoto.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //选择一张照片
        Intent intent = new Intent();
        intent.setAction("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        intent.addCategory("android.intent.category.OPENABLE");
        startActivityForResult(intent, PICK_RESOURCE);
    }
});

重载onActivityForResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode,resultCode,data);
    switch (requestCode){
        case PICK_RESOURCE: //显示选择的照片
            if (resultCode == Activity.RESULT_OK) {
                try{
                    //使用ContentProvider通过URI获取原始图片
                    Bitmap photo = MediaStore.Images.Media.getBitmap(getContentResolver(),data.getData());
                    if(photo != null){
                        mImgView.setImageBitmap(photo);
                    }else{
                        mTextView.setText("请选择一张照片");
                    }
                } catch (FileNotFoundException e) {
                    mTextView.setText("照片打开失败!请重试...");
                    e.printStackTrace();
                } catch (IOException e) {
                    mTextView.setText("照片打开失败!请重试...");
                    e.printStackTrace();
                }
            }
            break;
        default:
            break;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值