Ich entwickle eine Anwendung, in der ich an Android Contacts arbeite und nicht in der Lage bin voranzukommen. In der Anwendung muss der Kontakt, der aktualisiert wird, an den Server gesendet werden, oder der Kontakt, der gelöscht wird, sollte zur Synchronisierung an den Server gesendet werden.Android: Aktualisiere und lösche nur Kontakt
Ich bin mit dem Kontaktservice wie:
public class ContactService extends Service {
private int mContactCount;
Cursor cursor = null;
static ContentResolver mContentResolver = null;
// Content provider authority
public static final String AUTHORITY = "com.android.contacts";
// Account typek
public static final String ACCOUNT_TYPE = "com.example.myapp.account";
// Account
public static final String ACCOUNT = "myApp";
// Instance fields
Account mAccount;
Bundle settingsBundle;
@Override
public void onCreate() {
super.onCreate();
// Get contact count at start of service
mContactCount = getContactCount();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Get contact count at start of service
this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver);
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
private int getContactCount() {
try {
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (cursor != null) {
return cursor.getCount();
} else {
cursor.close();
return 0;
}
} catch (Exception ignore) {
} finally {
cursor.close();
}
return 0;
}
private ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
this.onChange(selfChange, null);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
new changeInContact().execute();
}
};
public class changeInContact extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {
ArrayList<Integer> arrayListContactID = new ArrayList<Integer>();
int currentCount = getContactCount();
if (currentCount > mContactCount) {
// Contact Added
} else if (currentCount < mContactCount) {
// Delete Contact
} else if (currentCount == mContactCount) {
// Update Contact
}
mContactCount = currentCount;
return "";
}
@Override
protected void onPostExecute(String result) {
contactService = false;
} // End of post
}
}
Die Themen i bin vor wie folgt:
A: In dem obigen Code für das Erhalten der aktualisiert Kontakt ich brauche Überprüfen Sie die Version von jedem Kontakt von Gerät mit meiner Datenbank gespeicherte Version von Kontakten. Das hat viel Zeit für eine große Anzahl von Kontakten benötigt.
B. Für gelöschte Kontakt bekommen ich, dass die Daten für die Raw-ID in der Datenbank gespeichert überprüfen müssen in Gerät vorhanden ist oder nicht. Wenn nicht, wird der Kontakt gelöscht. Es dauert auch zu viel Zeit, um ganze Kontakte zu überprüfen.
Aber die gleiche Kontaktauffrischung in was app in wenigen Sekunden wie 2 bis 3 Sekunden ...
EDIT getan: In dem obigen Code in folgenden Modul:
if (currentCount > mContactCount) {
// Contact Added
Log.d("In","Add");
} else if (currentCount < mContactCount) {
// Delete Contact
Log.d("In","Delete");
} else if (currentCount == mContactCount) {
// Update Contact
Log.d("In","Update");
}
Ich legte das Protokoll. So wird die Update-Modul oft genannt, und auch wenn ich füge oder die Zeit löschen ...
Bitte leite mich und schlagen Sie mich, was das Timing für die oben genannten Aufgaben zu tun zu reduzieren ...
Vielen Dank für die Antwort. Aber über den Antworten gibt mir mein App-Account Kontakt gelöscht oder aktualisiert. Ich brauche alle Kontakte, die gelöscht oder aktualisiert werden. –
Entfernen Sie einfach die Bedingung des Kontotyps aus dem wo, wenn Sie an allen Konten interessiert sind – RocketRandom
Ich habe das auch versucht, aber viele gelöschte und aktualisierte Nummern. Die Notwendigkeit ist nur die letzte aktualisierte oder gelöschte Nummer. –