registerreceiver,registerreceiver null
Android2.1 BroadCastReceiver接收不到数据,什么原因
Android2.1 BroadCastReceiver接收不到数据的原因是因为不支持某些文件类型。具体解决方式为:
1.蓝牙默认支持所有图片,所有视频,所有音频,文本类型,html,zip,excel,word,ppt,pdf等类型。
2.使用RE文件夹,找到package/app/bluetooth,对其目录下的AndroidManifest.xml文件的data android:mimeType="" /,添加相应的类型即可。
3.具体的添加内容为receiver android:name=".GetData"
intent-filter
action android:name="android.provider.Telephony.SMS_RECEIVED" /
/intent-filter
/receiver
这一段写到application标记里面。
android 注册广播有多少种方式
有两种注册广播方式:
1.常驻型广播
常驻型广播,当应用程序关闭了,如果有广播信息来,写的广播接收器同样的能接收到,它的注册方式就是在应用程序的AndroidManifast.xml 中进行注册,这种注册方式通常又被称作静态注册。这种方式可以理解为通过清单文件注册的广播是交给操作系统去处理的。示例代码如下:
AndroidManifest.xml中配置广播
?xml version="1.0" encoding="utf-8"?
manifest xmlns:android=""
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0"
application android:icon="@drawable/icon" android:label="@string/app_name"
activity android:name=".BroadCastReceiverActivity"
android:label="@string/app_name"
intent-filter
action android:name="android.intent.action.MAIN" /
category android:name="android.intent.category.LAUNCHER" /
/intent-filter
/activity
!--广播注册、name里面填写广播类的路径--
receiver android:name=".SmsBroadCastReceiver"
intent-filter android:priority="20"
action android:name="android.provider.Telephony.SMS_RECEIVED"/
/intent-filter
/receiver
/application
uses-sdk android:minSdkVersion="7" /
!-- 权限申请 --
uses-permission android:name="android.permission.RECEIVE_SMS"/uses-permission
/manifest
2.非常驻型广播
非常驻型广播,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。比如写一个监听 SDcard 状态的广播接收者:
package cn.sunzn.mosecurity.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
public class SDcard extends Activity {
SdcardStateChanageReceiver sdcardStateReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sdcardStateReceiver = new SdcardStateChanageReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addDataScheme("file");
registerReceiver(sdcardStateReceiver, filter);
}
protected void onDestroy() {
unregisterReceiver(sdcardStateReceiver);
}
class SdcardStateChanageReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
checkSDCard();
}
public void checkSDCard() {
String state = Environment.getExternalStorageState();
System.out.println(state);
if (state.equals(Environment.MEDIA_REMOVED) || state.equals(Environment.MEDIA_UNMOUNTED)) {
System.out.println("SDCard 已卸载!");
}
}
}
}
注册广播接收器(registerReceiver)分析
动态注册registerReceiver:主要就是将广播接收器receiver封装到LoadedApk的InnerReceiver(继承IIntentReceiver接口的binder对象)及广播类型filter传给ActivityManagerService保存起来,别人在发送广播时,在AMS过滤后发送过来.
时序图:
Step2:ContextImpl.registerReceiver():
getOuterContext()就是XXXActivity.
Setp3:scheduler = mMainThread.getHandler()是handler:
Step 4:LoadedApk.getReceiverDispatcher,返回IIntentReceiver接口对象rd的Binder对象:
从LoadedApk的成员变量mReceivers获取相应的ReceiverDispatcher,如果不存在则新建一个,并保存起来。
Step5:LoadedApk .ReceiverDispatcher :
新建ReceiverDispatcher同时,会创建一个实现IIntentReceiver接口的binder对象:InnerReceiver,这是用来和AMS通讯时调用performReceive
Step6:ActivityManagerProxy .registerReceiver
这个函数通过Binder驱动程序就进入到ActivityManagerService中的registerReceiver函数中去了。
Step 7:AMS.registerReceiver:
把广播接收器receiver和filter关联起来,并保存到mReceiverResolver.这样,广播接收器注册到这边就可以了。