安卓中通过intent组件跳转到系统联系人编辑界面,及具体案例分析

来源:互联网 发布:二木淘宝店 编辑:程序博客网 时间:2024/06/05 04:36

本人借鉴各路大神的启迪,特写此博客,以表敬仰,大家共勉,多提宝贵意见。

======================================================================================================

First:  首先具体方法如下:

   通过intent跳转到android系统联系人的方法之一:

Intent intent=new Intent(Intent.ACTION_EDIT);
Uri data=ContactsContract.Contacts.getLookupUri(contact.get_id(), contact.getLookupKey());
intent.setDataAndType(data, ContactsContract.Contacts.CONTENT_ITEM_TYPE);
intent.putExtra("finishActivityOnSaveCompleted", true);
context.startActivity(intent);

======================================================================================================

Second:  以下部分是本人的一个学习的案例:

点击左上角编辑小图标,跳转到手机中的联系人编辑页面:具体截图在代码下方

public static void showDetail(final Context context, final Contact contact) {
AlertDialog.Builder builder=new AlertDialog.Builder(context);
//标准的AlertDialog的写法
/*builder.setIcon/setTittle/setMessage/setPositiveButton/setNativeButton
builder.create().show();*/
final AlertDialog dialog=builder.create();
dialog.show();
Window window=dialog.getWindow();//创建窗口,然后添加布局文件,用来显示联系人详细信息
/**在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。
* 不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;
* 而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 
* 具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。
LayoutInflater 是一个抽象类,在文档中如下声明:
  public abstract class LayoutInflater extends Object

获得 LayoutInflater 实例的三种方式:
1.LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()
2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
3. LayoutInflater inflater = LayoutInflater.from(context);  */
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.contact_detail_dialog1, null);
//window.setContentView(layoutId/view)两种方式,指定布局文件,或者view都可以,在layout中创建
window.setContentView(view);
//关联详情页面的头像,姓名,电话信息
ImageView ivImage=(ImageView) view.findViewById(R.id.iv_detail_image);
TextView tvName=(TextView) view.findViewById(R.id.tv_detail_name);
TextView tvNumber=(TextView) view.findViewById(R.id.tv_detail_number);
ivImage.setImageBitmap(getAmage(context, contact.getPhoto_id()));
tvName.setText(contact.getName());
tvNumber.setText(contact.getNumber());
-
//关联编辑图标和关闭图标,设置监听
ImageView ivEdit=(ImageView) view.findViewById(R.id.iv_detail_edit);
ImageView ivClose=(ImageView) view.findViewById(R.id.iv_detail_close);

//设置点击关闭按钮的监听
ivClose.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
dialog.dismiss();

}
});


ivEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//发送一个隐式意图,打开手机系统联系人界面编辑contact的信息,
Intent intent=new Intent(Intent.ACTION_EDIT);
//需要获取到数据库contacts表中lookup列中的key值,在上面遍历contacts集合时获取到
Uri data=ContactsContract.Contacts.getLookupUri(contact.get_id(), contact.getLookupKey());
intent.setDataAndType(data, ContactsContract.Contacts.CONTENT_ITEM_TYPE);
intent.putExtra("finishActivityOnSaveCompleted", true);
context.startActivity(intent);
dialog.dismiss();
}
});

}

====================================================================================================================================

总结:在Android 4.0(API版本14)和更高的版本,Contacts应用中的一个问题会导致错误的页面导航。

我们的应用发送一个编辑联系人的Intent到Contacts应用,用户编辑并保存这个联系人,当用户点击Back键的时候会看到联系人列表页面。用户需要点击最近使用的应用,然后选择我们的应用,才能返回到我们自己的应用。

要在Android 4.0.3(API版本15)及以后的版本解决此问题,需要添加finishActivityOnSaveCompleted扩展数据参数到这个Intent,并将它的值设置为true。Android 4.0之前的版本也能够接受这个参数,但是不起作用。为了设置扩展数据,请按照以下方式去做:

 intent.putExtra("finishActivityOnSaveCompleted", true);
last:  以上内容便是我对于intent的一些理解,其中部分借鉴了各路朋友的总结,特此声明。

             谢谢大家!

0 0