Android权威编程指南笔记 第十五章 隐式intent (未完)

第十五章 隐式intent

  • 分为两个部分
  1. 发送隐式Intent的部分
  2. 应用的AndroidManifest文件中的部分(作为响应)

发送隐式Intent

                Intent i = new Intent(Intent.ACTION_SEND);//指明要执行的操作
                i.setType("text/plain");  //设置数据类型
                i.putExtra(Intent.EXTRA_TEXT, getCrimeReport()); //将数据放到Extra中,响应的应用会自己知道该怎么处理
                i.putExtra(Intent.EXTRA_SUBJECT,
                        getString(R.string.crime_report_subject));
                i = Intent.createChooser(i, getString(R.string.send_report)); //展示选择器界面,第二个参数为选择器标题
                startActivity(i);
				Intent pickContact = new Intent(Intent.ACTION_PICK, //指明要执行的操作
                	ContactsContract.Contacts.CONTENT_URI); 		//查找数据的位置

AndroidManifest文件中的部分

  • 在Intent过滤器中向外声明自己能胜任的任务。
        <activity android:name=".CrimeListActivity">
            <intent-filter><!--过滤器 -->
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

获取联系人数据

  • 利用startActivityForResult(Intent, int )来发送Intent
		startActivityForResult(pickContact, REQUEST_CONTACT);   //申明要获取返回信息

  • 利用onActivityResult(int, int, Intent)处理、获取数据
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }

        if (requestCode == REQUEST_CONTACT && data != null) {   //从这里开始
            Uri contactUri = data.getData();
            
            String[] queryFields = new String[]{
                    ContactsContract.Contacts.DISPLAY_NAME //类似与数据库中的查询
            };
            // Perform your query - the contactUri is like a "where"
            // clause here
            Cursor c = getActivity().getContentResolver()
                    .query(contactUri, queryFields, null, null, null);   //通过ContentResolver访问处理联系人的定制类:ContentProvider。
            try {
                if (c.getCount() == 0) {
                    return;
                }
                
                c.moveToFirst();
                String suspect = c.getString(0);
                mCrime.setSuspect(suspect);
                mSuspectButton.setText(suspect);
            } finally {
                c.close();
            }
        }
    }

相关小记

  • 如果操作系统找不到匹配的activity,应用就会崩溃。故需要自检
 		//PackageManager知道Android设备上安装了那些组件和哪些actiity。
        PackageManager packageManager = getActivity().getPackageManager(); 

		//调用resolveActivity方法,可以找到给定的activity。下面flag标志是限定只搜索带有CATEGORY_DEFAULT标志的activity。
        if (packageManager.resolveActivity(pickContact,
                PackageManager.MATCH_DEFAULT_ONLY) == null) {
			//若没找到,则禁用按钮。否则应用会崩溃
            mSuspectButton.setEnabled(false);
        }
  • 显示Intent也可以使用隐式Intent的操作和数据部分。相当于要求特定的activity去做特定的事。

挑战练习

  • 利用ShareCompat类中的IntentBuilder优化应用。
               ShareCompat.IntentBuilder intentBuilder = ShareCompat.IntentBuilder
                        .from(getActivity())
                        .setType("text/plain")
                        .setText(getCrimeReport())
                        .setSubject(getString(R.string.crime_report_subject))
                        .setChooserTitle(R.string.send_report);

                intentBuilder.createChooserIntent();
                intentBuilder.startChooser();
  • 新增拨打电话的按钮
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值