可靠地关闭领域(碎片)

时间:2016-02-12 12:06:12

标签: android android-fragments realm

我正在开发一个利用领域和片段的应用程序。领域设置需要加密,要删除领域数据库,并在用户注销时生成新密钥。

为了执行注销,我在任务顶部启动了一个没有任何片段的新活动,并启动一个处理我所有注销清理的IntentService。

我遇到的问题是我似乎无法可靠地获取我的片段以释放它们的领域实例以允许删除领域。在onStop / onPause / onDestroy的片段中关闭领域,总是有一两个片段似乎花了很多时间关闭/清除Android的片段缓存。

我已经将我的视图寻呼机切换为使用FragmentStatePagerAdapers,这减少了碎片的数量,并且有所帮助。

所以在我的IntentService中,我已经开始遍历Realm.delete()直到它成功 - 它最终似乎做了。有时等待时间非常短,有时是等分钟。它变化很大。

我认为我的一个想法是发起一个事件(使用EventBus),片段会监听它会导致它们关闭它们的领域实例。

但有没有更好的方法让我的片段及时关闭/关闭他们的领域实例(除了根本不使用片段)?

RealmFragment.java:

import android.support.v4.app.Fragment;
import android.util.Log;

import io.realm.Realm;

public class RealmFragment extends Fragment {
    private Realm realm = null;
    private final Object realmLock = new Object();

    public Realm getRealm() {
        if (realm == null || realm.isClosed()) {
            synchronized (realmLock) {
                if (realm == null || realm.isClosed()) {
                    realm = Realm.getDefaultInstance();
                }
            }
        }
        return realm;
    }

    @Override
    public void onPause() {
        super.onPause();
        closeRealm();
    }

    @Override
    public void onStop() {
        super.onStop();
        closeRealm();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        closeRealm();
    }

    private void closeRealm() {
        if (realm != null && !realm.isClosed()) {
            synchronized (realmLock) {
                if (realm != null && !realm.isClosed()) {
                    try {
                        realm.close();
                    }
                    catch (Exception e) {
                        Log.e("REALM","Couldn't close realm.");
                    }
                    realm = null;
                }
            }
        }
    }

}

登录屏幕启动:

    case R.id.logout: {
       AlertDialog alertDialog = new AlertDialog.Builder(this)
       .setTitle(R.string.confirm_sign_out)
       .setMessage(R.string.sign_out_description)
       .setPositiveButton(
          android.R.string.ok, 
          new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
               // close this activity's realm before launching sign out.
               MyActivity.closeRealm();
               Intent signOutIntent = new Intent(MyActivity.this, SignOutActivity.class);
               signOutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
               // this starts the logout process. It begins with removing an Android 
               // system account, and a receiver that listens for that to complete. When 
               // the account removal is complete, then we can continue with the rest of
               // the logout process.
               Actions.logoutAccount(getApplicationContext());
               startActivity(signOutIntent);
               // I could call this before calling startActivity()?
               MyActivity.finish();
            }
      })
     .setNegativeButton(
        android.R.string.cancel, 
        new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
              dialog.dismiss();
           }
      })
     .setCancelable(true)
     .create();
     alertDialog.show();
     break;
   }

1 个答案:

答案 0 :(得分:0)

片段生命周期确实是问题所在。由于在上面的评论中提供了@ChrisitianMelchior的提示,我能够解决这个问题。关键是在活动上设置以下标志,如下所示:

signOutIntent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK );

这导致之前的活动(-ies)及其片段被关闭,从而解锁了这个领域。