Intent隐式启动自定义意图
这是Android高级编程上面的一个例子,先看一下程序的效果:
public class ContackPickerTest extends Activity{
private static final int REQUEST_CONTACT_PICKER=1;
private Button mContactPickerBtn;
private TextView mTextView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_picker_test);
mContactPickerBtn = (Button) findViewById(R.id.contact_picker_button);
mTextView=(TextView)findViewById(R.id.textView);
mContactPickerBtn.setOnClickListener(listener);
};
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_PICK, Uri.parse("content://contactsr"));
startActivityForResult(intent, REQUEST_CONTACT_PICKER);
}
};
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CONTACT_PICKER:{
if (resultCode==Activity.RESULT_OK) {
showContactName(data);
}
}
break;
default:
break;
}
}
private void showContactName(Intent data) {
Uri contactData=data.getData();
Cursor cursor=managedQuery(contactData, null, null, null, null);
cursor.moveToFirst();
String name=cursor.getString(cursor.getColumnIndexOrThrow(People.NAME));
mTextView.setText(name);
};
}public class ContactPicker extends Activity{
private ListView mListView;
private SimpleCursorAdapter mCursorAdapter;
private Cursor mCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_picker);
mCursor=getContactCursor(getIntent());
mListView=(ListView)findViewById(R.id.listView);
String[] from=new String[]{People.NAME};
int[] to=new int[]{R.id.textView};
mCursorAdapter=new SimpleCursorAdapter(this, R.layout.contact_picker_item, mCursor, from, to);
mListView.setAdapter(mCursorAdapter);
mListView.setOnItemClickListener(listener);
}
OnItemClickListener listener=new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mCursor.moveToPosition(position);
int rowID=mCursor.getInt(mCursor.getColumnIndexOrThrow("_id"));
Uri uri=Uri.parse(getContactData(getIntent()).toString()+rowID);
Intent intent=new Intent();
intent.setData(uri);
setResult(Activity.RESULT_OK, intent);
finish();
}
};
private Cursor getContactCursor(Intent intent) {
Cursor cursor;
Uri uri = getContactData(intent);
cursor=managedQuery(uri, null, null, null, null);
return cursor;
}
private Uri getContactData(Intent intent) {
Cursor cursor=null;
String dataPath=intent.getData().toString();
dataPath=dataPath.substring(0, dataPath.length()-1);
Uri uri=Uri.parse(dataPath+"/people/");
return uri;
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gao.apidemo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".contactpicker.ContackPickerTest" android:theme="@style/ToDoTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".contactpicker.ContactPicker">
<intent-filter>
<action android:name="android.intent.action.PICK"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" android:path="contactsr"/>
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
</manifest> 在这个从程序中如果写成Intent intent=new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));程序会出现错误,而如果写成Uri.parse("content://contacts/people")则会匹配系统自己的联系人列表,所以没有办法在Uri.parse("content://contactsr")上填了个r在manifest里面也相应的添了个r,然后再将这个r去掉。