动态注册/注销在Android中的广播接收器 [英] Dynamically register/unregister a broadcast receiver in android

查看:609
本文介绍了动态注册/注销在Android中的广播接收器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要动态地注册和注销我的接收器类广播:
android.net.wifi.STATE_CHANGE
如果我这样做在清单这工作得很好。但是,这使得静态的。我想要动态地做的活动课。什么是在活动课的记者的命令?

这是我的code是什么...
而我得到,因为注册和注销(多次)我的接收器(这是启动服务)的问题。

 公共类扩展启动画面{活动
    / **当第一次创建活动调用。 * /    私人广播接收器接收器=新的广播接收器(){        @覆盖
        公共无效的onReceive(上下文的背景下,意图意图){
            意图serviceIntent =新的Intent();
            serviceIntent.setAction(com.example.MyService);
            context.startService(serviceIntent);
        }
    };    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.initial);        最后IntentFilter的过滤器=新的IntentFilter();
        filter.addAction(android.net.wifi.STATE_CHANGE);        Button按钮=(按钮)findViewById(R.id.button1);
        最后切换按钮切换按钮=(切换按钮)findViewById(R.id.toggleButton1);        尝试{
                ......有些code ...
            如果(布尔==真){
                toggleButton.setChecked(真);
                this.registerReceiver(接收器,过滤器);
            }其他
                toggleButton.setChecked(假);
        }赶上(例外五){
            Log.e(错误,数据库,E);
        } {最后
                ...
        }        toggleButton.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                如果((toggleButton.isChecked())){
                    。getBaseContext()registerReceiver(接收器,过滤器);                }其他{
                    如果(接收器!= NULL){
                        。getBaseContext()unregisterReceiver(接收机);
                        接收器= NULL;
                    }                }
            }
        });
    }    @覆盖
    保护无效onResume(){
        super.onResume();
        如果(布尔==真){
            如果(接收== NULL)
                this.registerReceiver(接收器,过滤器);
        }
    }    @覆盖
    保护无效的onPause(){
        super.onPause();
        如果(接收器!= NULL){
            this.unregisterReceiver(接收机);
            接收器= NULL;
        }
    }
}


解决方案

该LocalBroadcastManager类用于注册和您的进程内发送意图的广播本地对象。这是更快,更安全的,因为你的事件不会离开你的应用程序。

下面的例子显示其注册为客户事件的活动叫我的事件。

  @覆盖
公共无效onResume(){
super.onResume();   //注册mMessageReceiver接收邮件。
   LocalBroadcastManager.getInstance(本).registerReceiver(mMessageReceiver,
     新的IntentFilter(我的事件));
}//处理程序接收意图的我的事件事件
私人广播接收器mMessageReceiver =新的广播接收器(){
@覆盖
公共无效的onReceive(上下文的背景下,意图意图){
   //包含在意向中提取数据
   字符串消息= intent.getStringExtra(信息);
   Log.d(接收器,得到消息:+消息);
 }
};@覆盖
保护无效的onPause(){
   //活动以来注销是不可见
   LocalBroadcastManager.getInstance(本).unregisterReceiver(mMessageReceiver);
   super.onPause();
}
//该方法被分配给按钮的布局
//通过单击属性
公共无效的onClick(查看视图){
   发信息();
}//发送一个Intent名为我的事件的操作。
私人无效的sendMessage(){
  意向意图=新意图(我的事件);
  //添加数据
  intent.putExtra(信息,数据);
  LocalBroadcastManager.getInstance(本).sendBroadcast(意向);
}

I want to dynamically register and unregister my receiver class with the broadcast: "android.net.wifi.STATE_CHANGE" This works very well if I do this in the manifest. But this makes it static. I want to do it dynamically in the activity class. What is its correspondent command in the activity class?

This is what my code is... and I am getting a problem because of registering and unregistering(multiple times) my receiver(which is starting a service).

public class startScreen extends Activity {
    /** Called when the activity is first created. */

    private BroadcastReceiver receiver = new BroadcastReceiver() {    

        @Override
        public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent();
            serviceIntent.setAction("com.example.MyService");
            context.startService(serviceIntent);    
        }    
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.initial);

        final IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.wifi.STATE_CHANGE");   

        Button button = (Button) findViewById(R.id.button1);
        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);

        try {
                ...some code...
            if (bool == true) {
                toggleButton.setChecked(true);
                this.registerReceiver(receiver, filter);
            } else
                toggleButton.setChecked(false);
        } catch (Exception e) {
            Log.e("Error", "Database", e);
        } finally {
                ...
        }

        toggleButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if ((toggleButton.isChecked())) {
                    getBaseContext().registerReceiver(receiver, filter);

                } else {
                    if (receiver != null) {
                        getBaseContext().unregisterReceiver(receiver);
                        receiver = null;
                    }

                }
            }
        });
    }    

    @Override
    protected void onResume() {
        super.onResume();
        if (bool == true) {
            if (receiver == null)
                this.registerReceiver(receiver, filter);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (receiver != null) {
            this.unregisterReceiver(receiver);
            receiver = null;
        }
    }
}

解决方案

The LocalBroadcastManager class is used to register for and send broadcasts of Intents to local objects within your process. This is faster and more secure as your events don't leave your application.

The following example shows an activity which registers for a customer event called my-event.

@Override
public void onResume() {
super.onResume();

   // Register mMessageReceiver to receive messages.
   LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
     new IntentFilter("my-event"));
}

// handler for received Intents for the "my-event" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
   // Extract data included in the Intent
   String message = intent.getStringExtra("message");
   Log.d("receiver", "Got message: " + message);
 }
};

@Override
protected void onPause() {
   // Unregister since the activity is not visible
   LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
   super.onPause();
} 
// This method is assigned to button in the layout
// via the onClick property
public void onClick(View view) {
   sendMessage();
}

// Send an Intent with an action named "my-event". 
private void sendMessage() {
  Intent intent = new Intent("my-event");
  // add data
  intent.putExtra("message", "data");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} 

这篇关于动态注册/注销在Android中的广播接收器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆