Подтвердить что ты не робот

Регистрация и отмена регистрации BroadcastReceiver во фрагменте

В моем приложении есть панель действий с вкладками из 3 фрагментов. Во втором фрагменте я регистрирую и отменяю регистрацию BroadcastReceiver. Я отменил регистрацию приемника в onPause и зарегистрировал его в onCreateView и в onResume.

getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

и

getActivity().unregisterReceiver(batteryInfoReceiver);

1) Можно ли зарегистрировать один и тот же приемник дважды (в onCreateView и onResume)? (это безопасно?)

2) Достаточно ли просто зарегистрировать приемник в onResume?

4b9b3361

Ответ 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));
    }
}

Удачи.. Стефан Роннквист