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


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

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

и

getActivity().unregisterReceiver(batteryInfoReceiver);

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

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

3 55

3 ответа:

посмотреть жизненный цикл на Fragments:

onCreateView(): Система вызывает это, когда пришло время для фрагмента, чтобы нарисовать свой пользовательский интерфейс в первый раз. Чтобы нарисовать пользовательский интерфейс для вашего фрагмента, вы должны вернуть представление из этого метода, которое является корнем макета вашего фрагмента. Вы можете вернуть null, если фрагмент не предоставляет пользовательский интерфейс.

onResume(): Фрагмент виден в беге активность

onPause (): Обычно это место, где вы должны зафиксировать любые изменения, которые должны быть сохранены за пределами текущего сеанса пользователя (потому что пользователь может не вернуться).

вывод:

так что лучше зарегистрировать приемник только внутри onResume() и регистрацию в onPause(), потому что onCreateView() имеет дело только с иерархией представлений. Это не имеет ничего общего с приемником. Так что это не вредно, но, конечно, это бесполезный.

Я надеюсь, что это будет полезно!!

вот код, который работает для меня:

внутри макета:

<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);
}

фрагмент:

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));
    }
}

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

OnResume Register:

context.registerReceiver(receiver,IntentFilter(BroadCastAction.action_success))

onPause отменить регистрацию:

context.unregisterReceiver(mContactBroadCastReceiver);