Android中Intent和IntentFilter进行通信

2017-01-01 10:14

后天就是2017了,提前祝大家新年快乐!最近忙得头晕头转向的,难得有天轻松日!正好能给我时间写篇博文,整理下知识!

首先,必须提出的是,概念性的东西在这里就不手打了,如什么是Intent,Intent如何使用!这里最好查看官方文档,说得比我说的详细的多,而且更加全面。

实例一: 指定Action调用系统的Activity
这里写图片描述
实例三:Data属性配置
这里写图片描述
实例四:使用Action,Data属性启动系统Activity
这里写图片描述

Intent启动不同组件的方法

  • Activity

    1. startActivity(Intent intent);

    2. startActivityForResult(Intent intent,int requestCode);

  • Service

    1. componentName startService(Intent service);

    2. boolean bindService(Intent service,ServiceConnection conn, int flags);

  • BroadcastReceiver

    1. sendBroadcast(Intent intent);

    2. sendBroadcast(Intent intent,String receiverPermission)

    3. sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras);

    4. sendOrderedBroadcast(Intent intent,String receiverPermission)

    5. sendStickyBroadcast(Intent intent);

    6. sendStickyBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras)

  • Data,Type属性与intent-filter配置

    1. Data通常用于给Action提供操作的数据,接受一个Uri对象。
      Data的通常格式:content://com.android.contacts/contacts/1
      Uri总满足如下格式:scheme://host:post/path
    2. Type属性用于指定该Data属性所指定的Uri对应的MIME类型,可以为任何类型,只要符合abc/xyz格式的字符串即可。

    注意:这两个属性会相互覆盖,如果希望Intent同时拥有的话,必须待用Intent的setDataAndType()方法.

    指定Action调用系统的Activity

    启动Activity的标准Action常量以及对应的字符串
    这里写图片描述

    标准的Category常量以及对应的字符串

    这里写图片描述

    实例一查看并获取联系人电话

    MainActivity.java代码:

    public class MainActivity extends Activity
    {
        final int PICK_CONTACT = 0;
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button bn = (Button) findViewById(R.id.bn);
            // 为bn按钮绑定事件监听器
            bn.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View arg0)
                {
                    // 创建Intent
                    Intent intent = new Intent();
                    // 设置Intent的Action属性
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    // 设置Intent的Type属性
                    intent.setType("vnd.android.cursor.item/phone");
                    // 启动Activity,并希望获取该Activity的结果
                    startActivityForResult(intent, PICK_CONTACT);
                }
            });
        }
        @Override
        public void onActivityResult(int requestCode
                , int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode)
            {
                case (PICK_CONTACT):
                    if (resultCode == Activity.RESULT_OK)
                    {
                        // 获取返回的数据
                        Uri contactData = data.getData();
                        CursorLoader cursorLoader = new CursorLoader(this
                                , contactData, null, null, null, null);
                        // 查询联系人信息
                        Cursor cursor = cursorLoader.loadInBackground();
                        // 如果查询到指定的联系人
                        if (cursor.moveToFirst())
                        {
                            String contactId = cursor.getString(cursor
                                .getColumnIndex(
                                    ContactsContract.Contacts._ID));
                            // 获取联系人的名字
                            String name = cursor.getString(cursor
                                .getColumnIndexOrThrow(
                                    ContactsContract.Contacts.DISPLAY_NAME));
                            String phoneNumber = "此联系人暂未输入电话号码";
                            //根据联系人查询该联系人的详细信息
                            Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.
                                    Phone.CONTENT_URI, null,
                                    ContactsContract.CommonDataKinds.Phone.                                                 CONTACT_ID
                                    + " = " + contactId, null, null);
                            if (phones.moveToFirst())
                            {
                                //取出电话号码
                                phoneNumber = phones
                                    .getString(phones
                                    .getColumnIndex(ContactsContract
                                    .CommonDataKinds.Phone.NUMBER));
                            }
                            // 关闭游标
                            phones.close();
                            EditText show =(EditText)findViewById(R.id.show);
                            show.setVisibility(View.VISIBLE);
                            //显示联系人的名称
                            show.setText(name);
                            EditText phone =(EditText)findViewById(R.id.phone);
                            phone.setVisibility(View.VISIBLE);
                            //显示联系人的电话号码
                            phone.setText(phoneNumber);
                        }
                        // 关闭游标
                        cursor.close();
                    }
                    break;
            }
        }
    }

    实例二:返回系统界面

    // 创建Intent对象
                    Intent intent = new Intent();
                    // 为Intent设置Action、Category属性
                    intent.setAction(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    startActivity(intent);

    实例三:Data属性配置。

    注意观察:
    1. 如果目标组件<data…/>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性相同,即可启动该组件!
    2. 如果目标组件<data…/>子元素只指定了android:scheme,android:host属性,那么只要Intent的Data属性的scheme,host部分与android:scheme,android:host属性相同,即可启动该组件!
    3. 如果目标组件<data…/>子元素只指定了android:scheme,android:host,android:port属性,那么只要Intent的Data属性的scheme,host,port部分与android:scheme,android:host,android:port属性相同,即可启动该组件!

    MainActivity代码:

    public class MainActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        public void scheme(View source)
        {
            Intent intent = new Intent();
            // 只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.aserbao.org:1234/test"));
            startActivity(intent);
        }
        public void schemeHostPort(View source)
        {
            Intent intent = new Intent();
            // 只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.imerbao.org:8888/test"));
            startActivity(intent);
        }
        public void schemeHostPath(View source)
        {
            Intent intent = new Intent();
            // 只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.imerbao.org:1234/mypath"));
            startActivity(intent);
        }
        public void schemeHostPortPath(View source)
        {
            Intent intent = new Intent();
            // 只设置Intent的Data属性
            intent.setData(Uri.parse("lee://www.imerbao.org:8888/mypath"));
            startActivity(intent);
        }
        public void schemeHostPortPathType(View source)
        {
            Intent intent = new Intent();
            // 同时设置Intent的Data、Type属性
            intent.setDataAndType(Uri.parse("lee://www.imerbao.org:8888/mypath")
                , "abc/xyz");
            startActivity(intent);
        }
    }

    AndroidManifest.xml代码:

        <application
     android:allowBackup="true"
     android:icon="@drawable/ic_launcher"
     android:label="@string/app_name"
     android:theme="@style/AppTheme" >
            <activity
     android:name=".MainActivity"
     android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
     android:icon="@drawable/ic_scheme"
     android:name=".SchemeActivity"
     android:label="指定scheme的Activity">
                <intent-filter>
                    <action android:name="xx" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 只要Intent的Data属性的scheme是lee,即可启动该Activity -->
                    <data android:scheme="lee" />
                </intent-filter>
            </activity>
            <activity
     android:icon="@drawable/ic_host"
     android:name=".SchemeHostPortActivity"
     android:label="指定scheme、host、port的Activity">
                <intent-filter>
                    <action android:name="xx" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 只要Intent的Data属性的scheme是lee,且host是www.imerbao.org
     port是8888即可启动该Activity -->
                    <data android:scheme="lee"
     android:host="www.imerbao.org"
     android:port="8888" />
                </intent-filter>
            </activity>
            <activity
     android:icon="@drawable/ic_sp"
     android:name=".SchemeHostPathActivity"
     android:label="指定scheme、host、path的Activity">
                <intent-filter>
                    <action android:name="xx" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 只要Intent的Data属性的scheme是lee,且host是www.imerbao.org
     path是/mypath,即可启动该Activity -->
                    <data android:scheme="lee"
     android:host="www.imerbao.org"
     android:path="/mypath" />
                </intent-filter>
            </activity>
            <activity
     android:icon="@drawable/ic_path"
     android:name=".SchemeHostPortPathActivity"
     android:label="指定scheme、host、port、path的Activity">
                <intent-filter>
                    <action android:name="xx" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 需要Intent的Data属性的scheme是lee,且host是www.imerbao.org
     port是8888,且path是/mypath,才可启动该Activity -->
                    <data android:scheme="lee"
     android:host="www.imerbao.org"
     android:port="8888"
     android:path="/mypath"/>
                </intent-filter>
            </activity>
            <activity
     android:icon="@drawable/ic_type"
     android:name=".SchemeHostPortPathTypeActivity"
     android:label="指定scheme、host、port、path、type的Activity">
                <intent-filter>
                    <action android:name="xx"/>
                    <category android:name="android.intent.category.DEFAULT" />
                    <!-- 需要Intent的Data属性的scheme是lee,且host是www.imerbao.org
     port是8888,且path是/mypath
     且type是abc/xyz,才可启动该Activity -->
                    <data android:scheme="lee"
     android:host="www.imerbao.org"
     android:port="8888"
     android:path="/mypath"
     android:mimeType="abc/xyz"/>
                </intent-filter>
            </activity>
    
        </application>
    

    实例四:使用Action,Data属性启动系统Activity

    MainActivity代码:

    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button bn = (Button) findViewById(R.id.bn);
            // 为bn按钮添加一个监听器
            bn.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    // 创建Intent
                    Intent intent = new Intent();
                    String data = "http://blog.csdn.net/qq_32175491";
                    // 根据指定字符串解析出Uri对象
                    Uri uri = Uri.parse(data);
                    // 为Intent设置Action属性
                    intent.setAction(Intent.ACTION_VIEW);
                    // 设置Data属性
                    intent.setData(uri);
                    startActivity(intent);
                }
            });
            Button edit = (Button) findViewById(R.id.edit);
            // 为edit按钮添加一个监听器
            edit.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    // 创建Intent
                    Intent intent = new Intent();
                    // 为Intent设置Action属性(动作为:编辑)
                    intent.setAction(Intent.ACTION_EDIT);
                    String data = "content://com.android.contacts/contacts/1";
                    // 根据指定字符串解析出Uri对象
                    Uri uri = Uri.parse(data);
                    // 设置Data属性
                    intent.setData(uri);
                    startActivity(intent);
                }
            });
            Button call = (Button) findViewById(R.id.call);
            // 为call按钮添加一个监听器
            call.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    // 创建Intent
                    Intent intent = new Intent();
                    // 为Intent设置Action属性(动作为:拨号)
                    intent.setAction(Intent.ACTION_DIAL);
                    String data = "tel:12345678911";
                    // 根据指定字符串解析出Uri对象
                    Uri uri = Uri.parse(data);
                    // 设置Data属性
                    intent.setData(uri);
                    startActivity(intent);
                }
            });
        }

    总结:

    本文主要介绍了Android系统中Intent的功能和用法,当Android应用需要启动某个组件是,总需要借助Intent来实现。不管启动Activity还是Service,BroadcastReceiver组件,Android系统都是通过Intent来实现的。这里讲得知识一些基础的使用方法,如果要深挖,建议研究下底层代码!还是那句话,官方文档很重要!

    近段时间一直在研究如何写好博文,给今后的自己一些回顾以及希望能给正在学习Android路上的初学者一些帮助!如果有什么问题欢迎给我留言,看到及时回复!

    今天都已经31号了,文章准备了两天!洗洗准备睡了,基础知识点差不多都有写到。明天起床再修改下,准备发布了!