android中broadcastreceiver的用法-代码中注册
界面如下:
问题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的用法-代码中注册的更多相关文章
- android中broadcastreceiver的用法-manifest中注册。
package com.jinhoward.broadcast.activity; import com.jinhoward.broadcast.activity.R; import android. ...
- SQL语句在查询分析器中可以执行,代码中不能执行
问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...
- 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...
- VS中批量删除cs代码中的#region和#endregion
Visual Studio中如何批量删除cs代码中的#region和#endregion,不删除它们中间的代码,只删除这两个标记及标记的注解的方法.Vs中提供了很强大的文本查找与替换功能,简单的替换只 ...
- Xpath在选择器中正确,在代码中返回的是空列表问题
一.问题: 在进行爬虫的时候我们会用到xpath解析html文件,但是会有一种情况就是在xpath选择器中可以使用,但是在代码中就无法使用的情况. 二.原因: 1.是元素中有tbody的原因,这个元素 ...
- JDK中ThreadDump诊断Java代码中的线程死锁问题
多线程的死锁..死锁不是死了而是线程互相等待... 在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题. JavaJDK为我们提供了一个诊断工具叫做ThreadDu ...
- .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
.NET/C# 程序从 Main 函数开始执行,基本上各种书籍资料都是这么写的.不过,我们可以写多个 Main 函数,然后在项目文件中设置应该选择哪一个 Main 函数. 你可能会觉得这样没有什么用, ...
- 新建android项目报错,代码中找不到错误
通过网上资料的引导,做以下操作: 1.进入C:\Documents and Settings\Administrator\.android 删除路径下的debug.keystore及 ddms.cfg ...
- 之前的Android项目报错,新建Android项目报错,代码中找不到错误解决方案
打开一年前的东西,结果发现里面的android项目全部有个红叉,也找不到错误.新建一个项目也报错,首先确定自己的环境应该没问题,然后通过查看网上的资料,发现可能是debug的keystore到期啦. ...
随机推荐
- jquery获取显示器,屏幕的宽度,和高度
Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...
- JVM内存的那些事
前言 对于C语言开发的程序员来说,在内存管理方面,必须负责每一个对象的生命周期,从有到无. 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存 ...
- 第二百零四天 how can i 坚持
我应该不会看错吧.最近媒体热炒小米衰落了,有必要那么大张旗鼓的报道吗?小米.华为,坚决看好小米.感觉华为品牌有些杂乱,在走三星的老路,小米有些苹果的影子,但是,多了个互联网.互联网... 未来孰优孰劣 ...
- Event Functions
[Event Functions] A key concept in games programming is that of making changes to position, state an ...
- netdata linux环境下的安装
据说netdata监控很个性化,采用的显示方式也很漂亮,就来尝试安装.百度搜索到的安装教程的斑斑是1.0.顺藤摸瓜去wiki看了看,已经更新为1.4了,果断走起: 下载地址::https://gith ...
- 关键词权重计算算法:TF-IDF
TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术.TF-IDF是一种统计方法,用以评估一字词对于一个文件集或 ...
- C:数组
数组.排序 关于排序 :参考 关于数组: 参考 求a[i][j]行与列的和然后求平均值 参考 二维数组使用指针的表示方法 参考 字符串数组:char name [5][20] ={ {} , {} ...
- sqlserver锁表、解锁、查看锁表
sqlserver锁表.解锁.查看锁表 http://www.cnblogs.com/zfanlong1314/p/3698566.html http://www.cnblogs.com/chjf20 ...
- springmvc中forward和redirect
一.跳转 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; im ...
- 关于使用Transaction对于非数据库事务的操作
在操作数据库的过程中,为了数据的一致性,我们可以使用Transaction,要么成功的时候全部提交,要么有任何一个操作失败立即全部回滚.不仅仅是在数据库方面,有时候操作其他的内容,比如说对于系统文件的 ...