有没有办法获得某种通知/广播/等。从“帐户和同步设置”中删除自定义帐户时?
我拥有的应用程序可以为设备上的多个用户提供便利(这是供企业使用)并使用单个SQLite数据库。假设我在设备上为我的应用程序创建多个用户,并使用仅与这两个用户相关的数据填充数据库。我的问题是,如果其中一个用户从“帐户和同步设置”中删除,我无法清理SD卡上的数据库和/或某些外部文件。
我可以在冗余表中复制用户信息,并将其与注册帐户进行比较,然后如果表中的用户信息与AccountManager中的Account []数组不匹配,则从数据库中删除用户数据。感觉脏了。
答案 0 :(得分:12)
您有两种选择:
您可以使用addOnAccountsUpdatedListener
的{{1}}方法在AccountManager
或onCreate
的{{1}}方法中添加听众确定你在Activity
方法中删除了监听器(即不要在无休止运行的服务中使用它),或者用于检索Service
的{{1}}永远不会被垃圾收集
每次添加,删除或更改帐户时,onDestroy
都会使用操作Context
广播一个意图,您可以为其添加接收方。
答案 1 :(得分: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();
}
}