我有一个"接收器没有注册的例外"在使用片段的我的应用程序的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;
}
}
答案 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()
。