Android类-Intent

Intent是执行某操作的抽象描述。最常用的是启动Activity。
可以用于通过 startActivity(Intent)启动Activity, 通过startService(Intent)或bindservice(Intent,ServiceConnection,int)联系后台的Service,发送broadcastIntent给BroadcastReceiver组件。

1 Intent结构

主要的属性
- action :需要执行的操作,例如:ACTION_VIEW,ACTION_EDIT,ACTION_MAIN
- data    :操作的数据,例如 通讯录的联系人记录,通过Uri数据表示。
- category :操作的辅助信息。例如:CATEGORY_LAUNCHER表示启动后成为top-level的app。
- type :明确标识intent数据的类型。
- component :明确标识启动组件的class。当这个属性填写后,其他的属性都是optional的。
- extras :附加的Bundle信息。例如:我们要一个ACTION_SEND发送e-mail的action,就可以通过extras填充subject,body信息。

2 Intent类型

- 显式Intent : 一般用于app内部activity之间的调用(通过方法setComponnet或者setClass)
- 隐式Intent  :不用声明component属性,必须包括其它的足够信息来告诉系统来启动哪个component。

3 隐式Intent机制

Intent尝试匹配所有安装app中的<intent-filter>描述,除此之外,也匹配BoardcastReceiver对象通过registerReceiver(BroadcastReceiver,IntentFilter)显式注册的IntentFilter。
有三个信息用于Intent的匹配:action,type,category。通过此数据在PackageManager中进行查询。是否可以查询到合适的组件取决于app中AndroidManifect.xml提供的信息。

4 属性分类

- 标准的Activity Action : 经常通过startActivity(Intent)。经常用到的是ACTION_MAIN和ACTION_EDIT
- 标准的Broadcast Action:用于Intent定义来接收广播。经常经过registerReceiver(BroadcastReceiver,IntentFilter)或者manifest中的<receiver> tag
- 标准的Categories : 通过Intent的addCategory(String)。除了常用的DEFAULT category,还有ALTERNATIVE和SELECTED_ALTERNATIVE,增加这两个category,可以让别人通过 queryIntentActivityOptions和 addIntentOptions方法动态的找到此Activity。
- 标准的Extra 数据: 通过putExtras(String,Bundle)放入到Intent中
- Flags : 通过setFlags(int)和addFlags(int)放入Intent中。FLAG_ACTIVITY_* flags用于Context.startActivity(),FLAG_RECEIVER_* flags用于 Context.sendBroadcast()。例如:如果设置FLAG_ACTIVITY_NO_HISTORY flag,新的activity不会保存在activity历史堆栈中。

5 Demo:

(1) 通过ACTION_MAIN + CATEGORY_HOME 启动主屏
(2) 通过ACTION_SEND 发送Mail
(3) 通过ACTION_PICK打开通讯录,并选中一个item,得到返回值
(4) 通过ACTION_DIAL拨打指定的号码

public class IntentActivity extends Activity{


    Button mHomeScreen, mMailButton,mAddressButton, mDailButton;
    int REQUEST_CONTACT;

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

        mHomeScreen = (Button)findViewById(R.id.homescreen);
        mHomeScreen.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(Intent.ACTION_MAIN);
                i.addCategory(Intent.CATEGORY_HOME);
                startActivity(i);
            }
        });


        mMailButton = (Button)findViewById(R.id.mail);
        mMailButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_TEXT, "hi team, test text.");
                i.putExtra(Intent.EXTRA_SUBJECT, "Test Mail");
                i= Intent.createChooser(i, "Please choose..");
                startActivity(i);

            }
        });


        mAddressButton = (Button)findViewById(R.id.address);
        mAddressButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(Intent.ACTION_PICK);
                i.setData(ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(i, REQUEST_CONTACT); 
            }
        });

        mDailButton = (Button)findViewById(R.id.dail);
        mDailButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setAction(Intent.ACTION_DIAL);
                i.setData(Uri.parse("tel:13726218236"));
                startActivity(i);

            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode != Activity.RESULT_OK) return;

        if(requestCode == REQUEST_CONTACT){
            Uri contactUri = data.getData();

            String[] queryFilds = new String[]{
                    ContactsContract.Contacts.DISPLAY_NAME
            };

            Cursor c = this.getContentResolver().query(contactUri, queryFilds, null, null, null);

            if(c.getCount() == 0){
                c.close();
                return;
            }

            c.moveToFirst();
            Toast.makeText(this, "选中的项为: "+ c.getString(0), Toast.LENGTH_SHORT).show();
            c.close();
        }

    }

Reference:
http://www.android-doc.com/reference/android/content/Intent.html
http://www.android-doc.com/reference/android/content/pm/PackageManager.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值