使用Android片段

时间:2015-06-22 23:18:20

标签: android eclipse android-fragments broadcastreceiver

我有一个"接收器没有注册的例外"在使用片段的我的应用程序的OnDestroy方法。

我有一个MainActiviy类,我检查用户是否注册了一个帐户。 如果没有创建帐户,我加载注册帐户类片段以允许用户创建帐户。 用户创建帐户后单击按钮,我重新启动MainActivity类。

我只需在用户创建帐户后注册广播接收器。

但是,在从Frgamnent Class重新启动MainActivity类之后,我收到了未在主活动的事件OnDestroy中注册的接收器的例外。

任何帮助解决它将不胜感激。

先谢谢,Luiz

我的主要活动类

public class MainActivity extends Activity {

    // if run on phone, isSinglePane = true
    // if run on tablet, isSinglePane = false
    static boolean isSinglePane;
    private GcmUtil gcmUtil;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View v = findViewById(R.id.phone_container);
            if (!AccountRegisterCreated()){
                //this fragmment register an account to user, and save in Preferences 
                RegisterFragment myListFragment= new RegisterFragment();
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.add(R.id.phone_container, myListFragment);
                fragmentTransaction.commit();
                return;
            }
            registerReceiver(registrationStatusReceiver, new IntentFilter(Common.ACTION_REGISTER));
      }

      private BroadcastReceiver registrationStatusReceiver = new  BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null && Common.ACTION_REGISTER.equals(intent.getAction())) {
                switch (intent.getIntExtra(Common.EXTRA_STATUS, 100)) {
                    case Common.STATUS_SUCCESS:
                        getActionBar().setSubtitle("online");
                        break;
                    case Common.STATUS_FAILED:
                        getActionBar().setSubtitle("offline");
                        break;
                }
            }
        }
    };

@Override
protected void onPause() {
    ContentValues values = new ContentValues(1);
    super.onPause();
}

@Override
protected void onDestroy() {
     unregisterReceiver(registrationStatusReceiver);
 super.onDestroy();
}

private boolean AccountRegisterCreated(){
    SharedPreferences prefs;
    prefs= PreferenceManager.getDefaultSharedPreferences(this);
    String fullname = prefs.getString(DataProvider.COL_EMAIL,"");
    if (!fullname.isEmpty()) {
        return true;
    }
    return false;
}

}

My Fragment Class:

public class RegisterFragment extends Fragment {
    private static SharedPreferences prefs;
    static final String TAG = "pushabout";
    TextView name;
    TextView email;
    TextView password;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.register, null);
        name = (TextView) view.findViewById(R.id.reg_fullname);
        email = (TextView) view.findViewById(R.id.reg_email);
        password = (TextView) view.findViewById(R.id.reg_password);

        if (email.getText().toString().isEmpty()){
            email.setText(Common.getPreferredEmail());
        }
        Button mButton = (Button) view.findViewById(R.id.btnRegister);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //checa email e reg e salva pref e registra gcm
                prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString(DataProvider.COL_NAME, sname);
                editor.putString(DataProvider.COL_EMAIL, semail);
                editor.putString(DataProvider.COL_PWD, spassword);
                editor.commit();
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
        return view;
    }
}

2 个答案:

答案 0 :(得分:0)

问题不在于Fragment。这是你活动中的BroadcastReceiver。

尝试将BroadcastReceiver声明为类字段:

public class MainActivity extends Activity {
    ...
    BroadcastReceiver mBroadcastReceiver;
    ...

然后,您应该更改创建和注册接收器的方式。我这样做的方法是在活动的onResume而不是onCreate()期间注册。如果您这样做,则还需要在onPause()而非onDestroy()期间取消注册。它看起来像这样:

@Override
public void onResume() {
    super.onResume();

    // Create and register your receiver here.

    if (AccountRegisterCreated) {
        mBroadcastReceiver = new  BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                ....
            }
        }
        registerReceiver(mBroadcastReceiver, new IntentFilter(Common.ACTION_REGISTER));
    }

    ...
}

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

    // Unregister your receiver here

    if (mBroadcastReceiver != null) {
        unregisterReceiver(mBroadcastReceiver);
    }
}

答案 1 :(得分:0)

只需声明AccessLog.AccessLog.sendLog( interval=10, worker_functions={ AccessLog.AccessLog.backupAccessLog: ("logbackups", "example.log"), AccessLog.AccessLog.emptyAccessLog: ("example.log",), AccessLog.AccessLog.postLogstoElastic: () ), iterations=999 ) 类型的成员变量即可。注册boolean时,请将该变量设置为BroadcastReceiver。如果变量为true,则onDestroy()仅调用unregisterReceiver()