program tip

조각에 BroadcastReceiver 등록 및 등록 해제

radiobox 2020. 11. 30. 08:00
반응형

조각에 BroadcastReceiver 등록 및 등록 해제


내 앱에는 3 개의 조각 탭이있는 작업 표시 줄이 있습니다. 두 번째 조각에서는 BroadcastReceiver를 등록 및 등록 취소합니다. 나는에서 수신기의 등록을 취소 onPause하고에 등록 onCreateView하고에 onResume.

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

getActivity().unregisterReceiver(batteryInfoReceiver);

1) 동일한 수신자를 두 번 (onCreateView 및 onResume에서) 등록해도 괜찮습니까? (무해합니까?)

2) onResume에 리시버를 등록하는 것으로 충분합니까?


수명주기살펴보십시오 Fragments.

onCreateView () : 프래그먼트가 처음으로 사용자 인터페이스를 그릴 때 시스템이이를 호출합니다. 프래그먼트에 대한 UI를 그리려면 프래그먼트 레이아웃의 루트 인이 메서드에서 View를 반환해야합니다. 조각이 UI를 제공하지 않는 경우 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));
    }
}

행운을 빕니다 .. 스테판 Ronnkvist


OnResume 등록 :

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

onPause 등록 취소 :

context.unregisterReceiver(mContactBroadCastReceiver);

참고 URL : https://stackoverflow.com/questions/16616654/registering-and-unregistering-broadcastreceiver-in-a-fragment

반응형