正确的地方获取联系方式:android5

时间:2015-12-06 16:43:30

标签: android performance android-5.0-lollipop

我可以获取联系方式

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
    String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();
    Log.d(name, phoneNumber);
}

我想知道的是我应该在哪里写这段代码? 我已经在MainActivity(onCreate)函数中编写了它,但这导致每次打开应用程序时都会获取联系人,这会使应用程序加载速度变慢。
我只想获取联系方式的安装时间(以便一次性活动),之后我只需要新添加的联系方式,而不是获取整个联系方式。
添加新联系人时,System Broadcaster会向所有拥有" android.permission.READ_CONTACTS"权限的应用程序广播新添加的联系人详细信息。然后我的应用程序中的监听器获取此数据。
我是android的新手,因此无法使用正确的术语。

1 个答案:

答案 0 :(得分:1)

你必须使用AsyncTask在单独的线程中运行它,如下所示:

public class ContactLoader extends AsyncTask<Void, Void, Cursor> {

Context context;

public ContactLoader(Context context){
  this.context= context;
}
@Override
protected Cursor doInBackground(Void... voids) {

    return context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
}

@Override
protected void onPostExecute(Cursor phones) {
    while (phones.moveToNext()) {
        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        Toast.makeText(context, name, Toast.LENGTH_LONG).show();
        Log.d(name, phoneNumber);
    }

}}

并在您的活动中使用它

new ContactLoader(getApplicationContext()).execute();