19

ある種の通知/ブロードキャストなどを取得する方法はありますか?カスタムアカウントが「アカウントと同期の設定」から削除された場合はどうなりますか?

私が持っているアプリケーションは、デバイス上の複数のユーザーを容易にすることができ(これは企業で使用するためのものです)、単一のSQLiteデータベースを使用します。デバイス上にアプリケーション用に複数のユーザーを作成し、それら2人のユーザーにのみ関連するデータをデータベースに入力するとします。ここでの私の問題は、ユーザーの1人が「アカウントと同期の設定」から削除された場合、SDカード上のデータベースや一部の外部ファイルをクリーンアップする方法がないことです。

冗長テーブルのユーザー情報を複製して登録済みのアカウントと比較し、テーブルのユーザー情報とAccountManagerのAccount []配列が一致しない場合は、データベースからユーザーデータを削除することができます。私には汚い感じがします。

4

2 に答える 2

13

次の 2 つのオプションがあります。

  1. addOnAccountsUpdatedListenerのメソッドを使用して、またはのメソッドにAccountManagerリスナーを追加できます -- メソッドのリスナーを必ず削除してください(つまり、無限に実行中のサービスでこれを使用しないでください)。onCreateActivityServiceonDestroyContextAccountManager

  2. は、受信者を追加できるアカウントが追加、削除、または変更されるたびAccountsServiceに、アクションを含むインテントをブロードキャストします。AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION

于 2011-05-20T18:16:49.423 に答える
3

人々がアカウントのクリーンアップを実装する方法に関する例はあまり見られなかったので、自分のソリューションを投稿しようと思いました (実際には、受け入れられた回答のバリエーションです)。

public class AccountAuthenticatorService extends Service {
    private AccountManager _accountManager;
    private Account[] _currentAccounts;
    private OnAccountsUpdateListener _accountsUpdateListener = new OnAccountsUpdateListener() {
        @Override
        public void onAccountsUpdated(Account[] accounts) {

            // NOTE: this is every account on the device (you may want to filter by type)
            if(_currentAccounts == null){
                _currentAccounts = accounts;
                return;
            }

            for(Account currentAccount : _currentAccounts) {
                boolean accountExists = false;
                for (Account account : accounts) {
                    if(account.equals(currentAccount)){
                        accountExists = true;
                        break;
                    }
                }

                if(!accountExists){
                    // Take actions to clean up.  Maybe send intent on Local Broadcast reciever
                }
            }
        }
    };

    public AccountAuthenticatorService() {

    }

    @Override
    public void onCreate() {
        super.onCreate();
        _accountManager = AccountManager.get(this);

        // set to true so we get the current list of accounts right away.
        _accountManager.addOnAccountsUpdatedListener(_accountsUpdateListener, new Handler(), true);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
       _accountManager.removeOnAccountsUpdatedListener(_accountsUpdateListener);
    }

    @Override
    public IBinder onBind(Intent intent) {
        AccountAuthenticator authenticator = new AccountAuthenticator(this);
        return authenticator.getIBinder();
    }
}
于 2016-04-14T13:57:45.870 に答える