界面如下:

   

问题1:点击“解绑广播接收器“后再次点击”解绑广播接收器“后,程序崩溃,log信息如下:

08-04 05:04:35.420: E/AndroidRuntime(5521): FATAL EXCEPTION: main
08-04 05:04:35.420: E/AndroidRuntime(5521): java.lang.IllegalArgumentException: Receiver not registered: com.jinhoward.broadcast.receiver.SecondReceiver@40cfec98
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:657)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1339)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:445)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at com.jinhoward.broadcast.activity.MainActivity$3.onClick(MainActivity.java:62)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.view.View.performClick(View.java:4204)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.view.View$PerformClick.run(View.java:17355)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.os.Handler.handleCallback(Handler.java:725)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.os.Looper.loop(Looper.java:137)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at java.lang.reflect.Method.invoke(Method.java:511)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-04 05:04:35.420: E/AndroidRuntime(5521):     at dalvik.system.NativeStart.main(Native Method)

后来排查代码百度找到问题答案,通过一个布尔变量来判断广播接收器是否已经注册。

package com.jinhoward.broadcast.activity;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; import com.jinhoward.broadcast.receiver.SecondReceiver; public class MainActivity extends Activity {
protected static final String ACTION = "com.jinhoward.broadcast.ACTION";
private Button btnBroadcast;
private Button registerReceiver;
private Button unregisterReceiver;
private SecondReceiver receiver;
private Boolean registerBoolean; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnBroadcast = (Button) findViewById(R.id.btnBroadcast);
btnBroadcast.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(ACTION);
sendBroadcast(intent);
}
}); registerReceiver = (Button) findViewById(R.id.btnregisterReceiver);
registerReceiver.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
receiver = new SecondReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION);
Log.i("MyReceiver", "注册广播接收器!");
registerReceiver(receiver, filter);
registerBoolean = true; }
}); unregisterReceiver = (Button) findViewById(R.id.btnunregisterReceiver);
unregisterReceiver.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//第一次进入到应用程序后就点击“解绑广播接收器”按钮会崩溃,此行代码处理此异常。
if (receiver == null) {
Toast.makeText(MainActivity.this, "广播接收器为空!",Toast.LENGTH_SHORT).show();
}
//点击“解绑广播接收器“后再次点击”解绑广播接收器“后,程序崩溃,错误log信息为:FATAL EXCEPTION: main
//08-04 05:04:35.420: E/AndroidRuntime(5521): java.lang.IllegalArgumentException: Receiver not registered: else if (registerBoolean == false) {
Toast.makeText(MainActivity.this, "广播接收器未注册!",Toast.LENGTH_SHORT).show();
}else{ unregisterReceiver(receiver);
registerBoolean = false;
Log.i("MyReceiver", "广播接收器已经取消注册!");
} }
});
}
}
package com.jinhoward.broadcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* @author jinhoward
* @blog http://blog.csdn.net/jinhoward
*/
public class SecondReceiver extends BroadcastReceiver
{ private static final String TAG = "MyReceiver"; public SecondReceiver()
{
Log.i(TAG, "广播接收器的构造函数");
} @Override
public void onReceive(Context context, Intent intent)
{
Log.i(TAG, "广播接收器接收到广播:"+intent.getAction());
} }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jinhoward.broadcast.activity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="com.jinhoward.broadcast.activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

代码下载地址

android中broadcastreceiver的用法-代码中注册的更多相关文章

  1. android中broadcastreceiver的用法-manifest中注册。

    package com.jinhoward.broadcast.activity; import com.jinhoward.broadcast.activity.R; import android. ...

  2. SQL语句在查询分析器中可以执行,代码中不能执行

    问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...

  3. 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写

    原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...

  4. VS中批量删除cs代码中的#region和#endregion

    Visual Studio中如何批量删除cs代码中的#region和#endregion,不删除它们中间的代码,只删除这两个标记及标记的注解的方法.Vs中提供了很强大的文本查找与替换功能,简单的替换只 ...

  5. Xpath在选择器中正确,在代码中返回的是空列表问题

    一.问题: 在进行爬虫的时候我们会用到xpath解析html文件,但是会有一种情况就是在xpath选择器中可以使用,但是在代码中就无法使用的情况. 二.原因: 1.是元素中有tbody的原因,这个元素 ...

  6. JDK中ThreadDump诊断Java代码中的线程死锁问题

    多线程的死锁..死锁不是死了而是线程互相等待... 在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题. JavaJDK为我们提供了一个诊断工具叫做ThreadDu ...

  7. .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换

    .NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的.不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数. 你可能会觉得这样没有什么用, ...

  8. 新建android项目报错,代码中找不到错误

    通过网上资料的引导,做以下操作: 1.进入C:\Documents and Settings\Administrator\.android 删除路径下的debug.keystore及 ddms.cfg ...

  9. 之前的Android项目报错,新建Android项目报错,代码中找不到错误解决方案

    打开一年前的东西,结果发现里面的android项目全部有个红叉,也找不到错误.新建一个项目也报错,首先确定自己的环境应该没问题,然后通过查看网上的资料,发现可能是debug的keystore到期啦. ...

随机推荐

  1. freetds链接错误

    用tsql连接mssql出现下面的错误 tsql -H 192.168.1.100 -p 1433 -U sa Password: sa locale is "en_US.UTF-8&quo ...

  2. 通过Microsoft Azure服务设计网络架构的经验分享(转)

    原文:http://www.infoq.com/cn/articles/azure-networking-tips 本文从产品设计和架构角度分享了 Microsoft Azure 网络服务方面的使用经 ...

  3. Umbraco中更换IndexSet中的NodeType后,搜索页面没有做出对应更改的效果

    在项目开发中,使用ExternalSearcher,有一个ExamineIndex.config文件中存放ExternalIndexSet 开始时是这样的 <!-- Default Indexs ...

  4. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  5. poj - 3683 - Priest John's Busiest Day(2-SAT)

    题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...

  6. sql with(lock) 与事务

    sql  select查询语句 表后面携带 with(nolock) 会获取到 在事务中已经执行 但还未完成提交的 记录   即使表被锁住也能查询到 当事务最终执行失败时  查询到的记录可能没有啦 不 ...

  7. Https如何保证安全

    Https加密安全. SSL加密.   Https和http的区别?Https如何做到安全? HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议. http是普通的超文本文 ...

  8. nhibernate操作sql2008数据库(添加数据失败)

    今天遇到一错误困了我一天,如此痛恨,遂记录于此: nhibernate框架+MVC模式搭的项目,添加数据时报错: "could not insert: [KXRMallManage.Mode ...

  9. xshell linux传文件

    yum  install lrzsz 安装完毕即可使用 rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具 windows端需要支持ZModem的telnet/s ...

  10. github命令

    git push origin master //把本地源码库push到Github上 git pull origin master //从Github上pull到本地源码库