界面如下:

   

问题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. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  2. 淘宝的ruby镜像已无人维护,使用ruby-china的RubyGems镜像

    淘宝的镜像已经无人维护了,参考 https://ruby-china.org/topics/29250 https://gems.ruby-china.org/ 使用新的镜像 $ gem source ...

  3. freetds相关

    什么是FreeTDS  简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协 ...

  4. 谈FTP服务器攻击技术及其展望 (修改中)

      欢迎大家给我投票: http://2010blog.51cto.com/350944 请看下篇:谈FTP服务器攻击技术及其展望 (下)              全文完http://chengua ...

  5. 第二百三十天 how can I 坚持

    上周日去蟒山摘的松子吗?应该是松子吧,裂开了呢.为啥呢.原来博客园可以上传图片,只是上传起来好费劲啊. 今天程哥问给我分的活多不多,我竟然说了句好多,哎.其实很多问题可以用还好来回答,还好,还行,哈哈 ...

  6. InterfaceConnect

    GUID aguid; _di_IInterface a, c; Calld::TEventSink* FEventSink; Server_tlb::_di_IServerWithEvents FS ...

  7. linux下生成 SSH 公钥,用于GitHub

    ssh-keygen -t rsa -C <email> 参见 https://help.github.com/articles/generating-ssh-keys/ Then add ...

  8. java使用org.apache.poi读取与保存EXCEL文件

    一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...

  9. jquery 应用小结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. ASP.NET|跳转(redirect)到其它站点,提示:当前线程终止。

    在XAF中,如果使用HttpContext.Response.Redirect()进行跳转,会出现”当前线程终止“的报错,跳转失败. 这时候,应该改用WebApplication.Redirect() ...