Intent详解以及实例
Android中统一用Intent来封装程序的“调用意图“。不管程序想启动一个Activity,一个Servicer,还是一个BroadcastReceiver。使用Intent提供了一个统一的编程模型。一定程度上面起到解耦的作用。
1.Intent在Android开发中的作用:
- Android应用中启动组件(Activity,Servicer,BroadcastReceiver)。
- 程序组件间的通信。
2.Intent对象的属性:Action(动作),Category(分类),Data(数据),Type(类型),Component(组件),Extra(扩展信息)和Flag(控制旗标)。
3.Intent类型:显示OR隐式。
eg:显示:根据指定的组件创建Intent。Intent intent=new Intent(this,SecondActivity.class);
eg:隐式:根据Intent指定的组件创建Intent。Intent intent=new Intent();intent.setAction(android.intent.action.MAIN);startActivity(intent);
往往在隐式的情况下,我们并不知道启动那个Activity,但是通过配置文件可以知道。在<intent-filter..../>元素中可以包含0~N个<action.../>子元素,0~N个<Category.../>子元素,0~1个<data.../>元素。只要某个配置文件中的某个组件能满足大于或者等于Intent所指定的要求,那么Intent就启动该组件。配置元素<intent-filter.../>中至少包括一个如下的Category子元素。<category android:name="android.intent.category.DEFAULT"/>
下面举一个例子:查看并获取联系人电话。
定义一个main.xml的布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <!--显示联系人姓名的文本框--> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/show" android:editable="false" android:cursorVisible="false"/> <!--显示联系人的电话的文本框--> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/phone" android:editable="false" android:cursorVisible="false"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查看联系人" android:id="@+id/bn" /> </LinearLayout>
在mainifest.xml中的定义:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="whushare.cn.whu.getcontactnumber" > <uses-permission android:name="android.permission.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".SysAction" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.GET_CONTENT"/> <category android:name="android.intent.category.LAUNCHER" /> <data android:mimeType="vnd.android.cursor.item/phone"/> </intent-filter> </activity> </application> </manifest>
Activity文件:
package whushare.cn.whu.getcontactnumber; import android.app.Activity; import android.content.CursorLoader; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.view.View; import android.widget.Button; import android.widget.EditText; public class SysAction extends Activity{ final int PICK_CONTACT=0; @Override protected void onCreate(Bundle savedInstanceState) { final int PICK_CONTACT=0; super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bn=(Button)findViewById(R.id.bn); //为bn按钮绑定事件监听器 bn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //创建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 protected 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.getColumnIndexOrThrow(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.setText(name); EditText phone=(EditText)findViewById(R.id.phone); //显示联系人的电话号码 phone.setText(phoneNumber); } //关闭游标 cursor.close(); } break; } } }