2013-05-17 18 views
49

La mia app ha una barra delle azioni con 3 schede dei frammenti. Nel secondo frammento registro e annullo la registrazione di un BroadcastReceiver. Annullo la registrazione del ricevitore in e lo registro in onCreateView e in onResume.Registrazione e annullamento della registrazione di BroadcastReceiver in un frammento

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

e

getActivity().unregisterReceiver(batteryInfoReceiver); 

1) E 'tutto a posto per registrare lo stesso ricevitore per due volte (in onCreateView e onResume)? (È innocuo?)

2) Is basta registrare il ricevitore in onResume?

+0

Ho ricevuto un errore di annullamento della registrazione quando lo stavo provando su un frammento. Il problema che ho dovuto affrontare era che stavo cercando di annullare la registrazione due volte. Una volta su onDestroy() e una volta su onPause(). Mi sono anche registrato una volta su onCreate() e una volta su onResume(). Più tardi, guardando il ciclo di vita del frammento, ho scoperto che ho solo bisogno di registrarmi su Resume() e di annullare la registrazione su onPause(). Questo è sufficiente per registrarsi e annullare la registrazione su un frammento. Spero che questo aiuti qualcuno a trasmettere con frammenti. :) –

risposta

112

Date un'occhiata al life-cycle di Fragments:

onCreateView(): Il sistema chiama questo quando è il momento per il frammento per disegnare l'interfaccia utente per la prima volta. Per disegnare un'interfaccia utente per il frammento, è necessario restituire una vista da questo metodo che rappresenta la radice del layout del frammento. È possibile restituire null se il frammento non fornisce un'interfaccia utente.

onResume(): Il frammento è visibile nell'attività esecuzione

onPause(): Questo è di solito dove si dovrebbe impegnare tutte le modifiche che deve essere mantenuta al di là della sessione utente corrente (perché l'utente potrebbe non tornare indietro).

Conclusione:

Quindi è meglio registrare il ricevitore solo all'interno onResume() e annullare la registrazione all'interno onPause() perchè onCreateView() offerte con vista unica gerarchia. Non ha nulla a che fare con il ricevitore. Quindi non è dannoso ma sicuramente è inutile.

Spero sia utile !!

3

Ecco il codice che funziona per me:

Disposizione Interno:

<Button 
    android:id="@+id/button2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="sendInternalBroadcast" 
    android:text="Broadcast"/> 

Frammento Disposizione:

<?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> 

all'interno di attività principale:

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

buona fortuna .. Stefan Ronnkvist

+0

La tua soluzione è fantastica! E per favore correggi il tuo profilo, amico. user1579736 non è figo Ma tu lo sei! –

0

onResume Registrati:

contesto.registerReceiver (ricevitore, IntentFilter (BroadCastAction.action_success))

onPause UNREGISTER:

context.unregisterReceiver (mContactBroadCastReceiver);

Problemi correlati