如何取消注册在其他活动中注册的广播接收器?

时间:2016-07-13 17:46:28

标签: android android-alarms android-broadcastreceiver

我有一个名为" AddReminder"的活动。用于创建警报的活动。每次创建警报时都会注册广播接收器。在另一个活动中,所有创建的警报将显示在列表视图中。当用户单击其中一个列表视图时,用户可以删除该警报。从列表视图中删除警报没有问题。但是,我不知道如何从删除警报活动中取消注册广播接收器。

添加闹钟的按钮

@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();

        }

警报等级

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

适配器OnItemClickListener(其他活动)

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

请帮助。

2 个答案:

答案 0 :(得分:0)

您应该考虑仅在原始Activity内使用这些广播,因为如果您不在同一BroadcastReceiver取消注册Activity,就会泄漏内存。

如果您想在后台接收广播事件,则应考虑使用指示here的服务。

您可以查看更完整的答案here

答案 1 :(得分:0)

如果您要远离活动,则应确保通过适当地覆盖OnStop,OnPause,OnDestroy ......方法来正确清理它,以便正确处理这些事件。

作为一般规则,应用的所有组件(包括非UI组件)都应该自行清理,而不是留给其他组件来清理它们。