获取联系方式的正确位置:android5

Correct place to fetch contact details : android5

我可以获取联系方式

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) 函数中编写了它,但这会导致每次我打开应用程序时都获取联系人,这使得应用程序加载速度变慢。
我只想在安装时获取联系人详细信息(这样就一次 activity),稍后我只需要新添加的联系人详细信息,而不是获取整个联系人列表。
就像添加新联系人时,System Broadcaster 向所有具有 "android.permission.READ_CONTACTS" 权限的应用程序广播新添加的联系人详细信息,然后我的应用程序中的侦听器获取此数据。
我是 android 的新手,所以无法使用正确的术语。

您必须 运行 在单独的线程中使用 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);
    }

}}

并在您的 activity 中像这样使用它

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