Регистрация и отмена регистрации BroadcastReceiver во фрагменте
В моем приложении есть панель действий с вкладками из 3 фрагментов.
Во втором фрагменте я регистрирую и отменяю регистрацию BroadcastReceiver.
Я отменил регистрацию приемника в onPause
и зарегистрировал его в onCreateView
и в onResume
.
getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
и
getActivity().unregisterReceiver(batteryInfoReceiver);
1) Можно ли зарегистрировать один и тот же приемник дважды (в onCreateView и onResume)? (это безопасно?)
2) Достаточно ли просто зарегистрировать приемник в onResume?
Ответы
Ответ 1
Посмотрите жизненный цикл Fragments
:
onCreateView():
Система вызывает это, когда время для фрагмента впервые выводит свой пользовательский интерфейс. Чтобы нарисовать пользовательский интерфейс для вашего фрагмента, вы должны вернуть представление из этого метода, который является корнем макета фрагмента. Вы можете вернуть значение null, если фрагмент не предоставляет пользовательский интерфейс.
onResume():
Фрагмент отображается в текущей активности
OnPause():
Обычно вы должны зафиксировать любые изменения, которые должны сохраняться за пределами текущего сеанса пользователя (поскольку пользователь может не вернуться).
Вывод:
Поэтому лучше зарегистрировать приемник только внутри onResume()
и отменить регистрацию внутри onPause()
, потому что onCreateView()
имеет дело только с иерархией представлений. Он не имеет ничего общего с получателем. Так что это не вредно, но, безусловно, бесполезно.
Надеюсь, это будет полезно!
Ответ 2
Вот код, который работает для меня:
Внутренняя компоновка:
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="sendInternalBroadcast"
android:text="Broadcast"/>
Макет фрагмента:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Fragment One"
android:id="@+id/fragmentoneTextView1"/>
</LinearLayout>
внутри Основная активность:
public void sendInternalBroadcast(View view)
{
Intent intent = new Intent();
intent.setAction("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup");
intent.putExtra("From", "sendInternalBroadcast");
sendBroadcast(intent);
}
Fragment:
import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class FragmentOne extends Fragment
{
View view;
Context _context;
PendingIntent pi;
BroadcastReceiver br;
AlarmManager am;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
view = inflater.inflate(R.layout.fragmentone, container, false);
setup();
return view;
}
@Override
public void onAttach(Context context)
{
super.onAttach(context);
_context = context;
}
@Override
public void onDestroyView()
{
super.onDestroyView();
_context.unregisterReceiver(br);
}
private void setup()
{
br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent i)
{
TextView tv = (TextView)view.findViewById(R.id.fragmentoneTextView1);
tv.setText("onReceive");
}
};
_context.registerReceiver(br, new IntentFilter("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"));
pi = PendingIntent.getBroadcast(_context, 0, new Intent("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"), 0);
am = (AlarmManager)(_context.getSystemService(Context.ALARM_SERVICE));
}
}
Удачи..
Стефан Роннквист