2016-07-13 12 views
0

Ich habe eine Aktivität namens "AddReminder" Aktivität, die für einen Alarm erstellen. Ein Broadcast-Empfänger wird jedes Mal registriert, wenn ein Alarm erstellt wird. In der anderen Aktivität wird der gesamte erstellte Alarm in einer Listenansicht angezeigt. Wenn ein Benutzer auf eine der Listenansichten klickt, kann der Benutzer den Alarm löschen. Es ist kein Problem für mich, den Alarm aus der Listenansicht zu löschen. Ich habe jedoch keine Ahnung, wie ich den Broadcast-Empfänger von der Löschalarmaktivität abmelden soll.Wie Registrierung von Broadcast-Empfänger, die in anderen Aktivitäten registriert?

Taste Alarm

@Override 
     public void onClick(View view) { 
      title_text = title.getText().toString(); 
      desc_text = desc.getText().toString(); 
      if(location.getSelectedItem()==null) 
       return; 
      else 
       place_text = location.getSelectedItem().toString(); 
      int id = group.getCheckedRadioButtonId(); 
      radioButton = (RadioButton)findViewById(id); 
      point_text = radioButton.getText().toString(); 

      //Log.d("location", place_text); 
      //Toast.makeText(getApplicationContext(), title_text + " " + desc_text + " " + place_text, Toast.LENGTH_LONG).show(); 

      if (!validateTitle()) { 
       return; 
      } 

      if (!validateDesc()) { 
       return; 
      } 

      if (!validatelocation()) { 
       return; 
      } 

      if(!validatePoints()){ 
       return; 
      } 

      reminder rmd = new reminder(getApplicationContext(), title_text, desc_text, place_text, point_text); 
      rmd.registerReceiver(); 

      submit(rmd); 
      Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show(); 
      finish(); 

     } 

Alarmklasse

public class reminder { 
private Context context; 
private String title, desc, location, point; 
private AlarmReceiver receiver; 

public reminder(){ 

} 

public reminder(Context context, String title, String desc, String location, String point){ 
    this.context = context; 
    this.title = title; 
    this.desc = desc; 
    this.location = location; 
    this.point = point; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getDesc() { 
    return desc; 
} 

public void setDesc(String desc) { 
    this.desc = desc; 
} 

public String getLocation() { 
    return location; 
} 

public void setLocation(String location) { 
    this.location = location; 
} 

public String getPoint() { 
    return point; 
} 

public void setPoint(String point) { 
    this.point = point; 
} 

public void registerReceiver() { 
    receiver = new AlarmReceiver(context, title, desc, location, point); 
    IntentFilter intentFilter1 = new IntentFilter(); 
    intentFilter1.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 
    context.registerReceiver(receiver, intentFilter1); 
} 

public void unregisterReceiver(int id){ 
    context.unregisterReceiver(receiver); 
} 

Adapter OnItemClickListener (andere Aktivität) hinzufügen

listrmd.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      position2 = id; 
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
      builder.setIcon(R.drawable.ic_menu_manage); 
      builder.setTitle("Option"); 
      builder.setAdapter(adapter2, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if(which == 0){ //edit option 
         Toast.makeText(getActivity(), "Edit", Toast.LENGTH_LONG).show(); 
        } 
        else{ //delete option 
         boolean flag = myDb.removeReminder(position2); 
         if(flag) 
          Toast.makeText(getActivity(), "Success", Toast.LENGTH_LONG).show(); 
          //I WANT TO UNREGISTER BROADCAST RECEIVER HERE 
         else 
          Toast.makeText(getActivity(), "Failed", Toast.LENGTH_LONG).show(); 
         updateList(); 
        } 
       } 
      }); 
      builder.show(); 
     } 
    }); 

Bitte Hilfe.

Antwort

0

Sie sollten diese Übertragungen nur innerhalb des ursprünglichen Activity verwenden, da Sie Speicher verlieren können, wenn Sie Ihre BroadcastReceiver in demselben Activity nicht abmelden.

Wenn Sie Broadcast-Ereignisse im Hintergrund empfangen möchten, sollten Sie einen Dienst wie angegeben verwenden here.

Sie können eine vollständigere Antwort here überprüfen.

+0

Hallo, danke für die Antwort ... kann der Service eine Absicht Filter Aktion durchführen? wenn kann ... wie es geht? irgendein Beispiel? –

+0

Die Dokumentation ist bereits auf der Antwort verlinkt, aber Sie können ein praktischeres Beispiel [hier] (http://stackoverflow.com/questions/9092134/broadcast-receiver-within-a-service/9092277#9092277) überprüfen. –

+0

ist nicht das Gleiche, wenn ich Service verwende? Ich muss noch Service für jeden erzeugten Alarm verursachen –

0

Wenn Sie von einer Aktivität weg navigieren, sollten Sie sicherstellen, dass Sie sie ordnungsgemäß bereinigen, indem Sie die OnStop-, OnPause-, OnDestroy ... -Methoden überschreiben, um diese Ereignisse richtig zu behandeln.

Als allgemeine Regel sollten alle Komponenten Ihrer App (einschließlich Nicht-UI-Komponenten) nach sich selbst bereinigen, nicht anderen Komponenten überlassen werden, um für sie aufzuräumen.