文章目录
- Intent启动不同组件的方法
- Activity
- Service
- BroadcastReceiver
- Data,Type属性与intent-filter配置
- 指定Action调用系统的Activity
- 启动Activity的标准Action常量以及对应的字符串
- 标准的Category常量以及对应的字符串
- 实例一查看并获取联系人电话
- MainActivity代码:
- 实例二:返回系统界面
- 实例三:Data属性配置。
- MainActivity代码:
- AndroidManifest.xml代码:
- 实例四:使用Action,Data属性启动系统Activity
- MainActivity代码:
- 总结:
后天就是2017了,提前祝大家新年快乐!最近忙得头晕头转向的,难得有天轻松日!正好能给我时间写篇博文,整理下知识!
首先,必须提出的是,概念性的东西在这里就不手打了,如什么是Intent,Intent如何使用!这里最好查看官方文档,说得比我说的详细的多,而且更加全面。
文章目录
- Intent启动不同组件的方法
- Activity
- Service
- BroadcastReceiver
- Data,Type属性与intent-filter配置
- 指定Action调用系统的Activity
- 启动Activity的标准Action常量以及对应的字符串
- 标准的Category常量以及对应的字符串
- 实例一查看并获取联系人电话
- MainActivity代码:
- 实例二:返回系统界面
- 实例三:Data属性配置。
- MainActivity代码:
- AndroidManifest.xml代码:
- 实例四:使用Action,Data属性启动系统Activity
- MainActivity代码:
- 总结:
实例一: 指定Action调用系统的Activity
实例三:Data属性配置
实例四:使用Action,Data属性启动系统Activity
Intent启动不同组件的方法
Activity
-
startActivity(Intent intent);
-
startActivityForResult(Intent intent,int requestCode);
Service
- componentName startService(Intent service);
- boolean bindService(Intent service,ServiceConnection conn, int flags);
BroadcastReceiver
- sendBroadcast(Intent intent);
- sendBroadcast(Intent intent,String receiverPermission)
- sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras);
- sendOrderedBroadcast(Intent intent,String receiverPermission)
- sendStickyBroadcast(Intent intent);
- sendStickyBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras)
Data,Type属性与intent-filter配置
- Data通常用于给Action提供操作的数据,接受一个Uri对象。
Data的通常格式:content://com.android.contacts/contacts/1
Uri总满足如下格式:scheme://host:post/path - Type属性用于指定该Data属性所指定的Uri对应的MIME类型,可以为任何类型,只要符合abc/xyz格式的字符串即可。
**注意:这两个属性会相互覆盖,如果希望Intent同时拥有的话,必须待用Intent的setDataAndType()方法. **
指定Action调用系统的Activity
启动Activity的标准Action常量以及对应的字符串
标准的Category常量以及对应的字符串
实例一查看并获取联系人电话
MainActivity代码:
public class MainActivity extends Activity
{final int PICK_CONTACT = 0;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Button bn = (Button) findViewById(R.id.bn);// 为bn按钮绑定事件监听器bn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0){// 创建IntentIntent 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);}});}@Overridepublic 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属性配置。
注意观察:
- 如果目标组件<data…/>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性相同,即可启动该组件!
- 如果目标组件<data…/>子元素只指定了android:scheme,android:host属性,那么只要Intent的Data属性的scheme,host部分与android:scheme,android:host属性相同,即可启动该组件!
- 如果目标组件<data…/>子元素只指定了android:scheme,android:host,android:port属性,那么只要Intent的Data属性的scheme,host,port部分与android:scheme,android:host,android:port属性相同,即可启动该组件!
MainActivity代码:
public class MainActivity extends Activity {@Overridepublic 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代码:
<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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><activityandroid: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><activityandroid: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.orgport是8888即可启动该Activity --><data android:scheme="lee"android:host="www.imerbao.org"android:port="8888" /></intent-filter></activity><activityandroid: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.orgpath是/mypath,即可启动该Activity --><data android:scheme="lee"android:host="www.imerbao.org"android:path="/mypath" /></intent-filter></activity><activityandroid: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.orgport是8888,且path是/mypath,才可启动该Activity --><data android:scheme="lee"android:host="www.imerbao.org"android:port="8888"android:path="/mypath"/></intent-filter></activity><activityandroid: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.orgport是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(){@Overridepublic void onClick(View v){// 创建IntentIntent 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(){@Overridepublic void onClick(View v){// 创建IntentIntent 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(){@Overridepublic void onClick(View v){// 创建IntentIntent 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号了,文章准备了两天!洗洗准备睡了,基础知识点差不多都有写到。明天起床再修改下,准备发布了!












