首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从接收方自己的onReceive()方法中注销“动态”onReceive可以吗?

从接收方自己的onReceive()方法中注销“动态”onReceive可以吗?
EN

Stack Overflow用户
提问于 2015-06-11 14:11:26
回答 3查看 1.6K关注 0票数 5

也就是说,我有一个动态创建的BroadcastReceiver,可以收听一段广播,然后我希望它取消注册。

我没有找到任何这样做的示例代码,但我也没有在android在线文档中找到任何禁止这样做的规则。但是,我不能让它在活动中停留很长时间,而且它在匿名类中,所以包含类甚至不知道变量名。

也就是说,代码看起来如下所示:

代码语言:javascript
复制
myInfoReceiver = new BroadcastReceiver() {
onReceive(Context ctx, Intent intt) {
    // do some Notification when I get here
    nm.notify("I got here") // obvious pseudo code
    ctx.unregisterReceiver(myInfoReceiver);
} // end onReceive
ctx.registerReceiver),uInfoReceiver, new IntentFilter(...));
}; // end BroadcastReceiver

但是当我运行它的时候,Android会在它调用注销器时抱怨,它坚持说接收者不是要注销的(我忘记了确切的措辞,但是它抛出了IllegalArgumentException)。

我还试着修改代码,以检查'intt‘中的操作是否与预期的相同--但是它仍然执行onReceive,但无声地未能注销。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-11 15:54:44

你的问题的答案是“是的”。然而..。

...you需要在与调用registerReceiver()相同的Context上调用registerReceiver()。在您发布的代码中,您正在调用作为参数传递给unregisterReceiver()Context上的onReceive()。这不是相同的Context,这就是为什么您要获得异常。

票数 6
EN

Stack Overflow用户

发布于 2015-06-11 14:20:29

我只想说是的,一点问题也没有。

例如,我将它用于一次性的位置修复,也可以在其他逻辑中使用,而不会发现它有任何问题。

而且我已经看过很多次了。

票数 1
EN

Stack Overflow用户

发布于 2016-09-28 13:28:54

我尝试过各种解决方案,最后我就是这样做的:

登记:

代码语言:javascript
复制
MyApplication.getInstance().getApplicationContext().registerReceiver(sentReceiver, new IntentFilter(SENT));

SentReceiver:

代码语言:javascript
复制
public class SentReceiver extends BroadcastReceiver  {
    public void onReceive(Context context, Intent arg1) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(context,
                        context.getString(R.string.sms_envoye), Toast.LENGTH_SHORT)
                        .show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(context,
                        context.getString(R.string.sms_defaillance_generique),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(context,
                        context.getString(R.string.sms_pas_de_service),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(context,
                        context.getString(R.string.sms_pas_de_pdu),
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(context,
                        context.getString(R.string.sms_radio_desactivee),
                        Toast.LENGTH_SHORT).show();
                break;
        }
        MyApplication.getInstance().getApplicationContext().unregisterReceiver(this);
    }

使用MyApplication:

代码语言:javascript
复制
public class MyApplication extends Application {
    private static MyApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }        
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30783282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档