registerreceiver(registerreceiver方法用于什么注册广播接收者)

http://www.itjxue.com  2023-02-14 18:41  来源:未知  点击次数: 

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标记里面。

注册广播接收器(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.这样,广播接收器注册到这边就可以了。

Broadcast(二)registerReceiver时sticky广播

ActivityManagerService.java

registerReceiver最后一段是这个

BroadcastQueue.java

registerReceiver的时候只用到了step1

如果有静态注册的接收者,有序广播也会有数据

step234每次只会处理一条广播一个接收者,app onReceive处理完毕会通知system进程,会再次调用processNextBroadcast

其他step在后续sendBroadcast文章分析

processNextBroadcast→step1

一直到结束,并没有设置超时,所以registerReceiver时sticky广播调用onReceive并不会导致ANR(普通广播即sendBroadcast和sendStickyBroadcast的动态注册接收者也只是经过processNextBroadcast→step1)

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 已卸载!");

}

}

}

}

android程序设计中如何注册server

直接在AndroidManifest 里增加一个service节点即可。

android中Service是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。可以启动一个服务Service来播放音乐,或者记录地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作。

服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

安卓文件可以删除吗?

可以删除,但是会重新生成的。

这个是系统的缓存文件,删了之后可能你存在手机上 的一些东西就不见了,里面一个是data文件及是存放数据的一个obb文件夹。

Android是一种基于Linux的自由及开放源代码的操作系统。

主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”。

Android操作系统最初由Andy Rubin开发,主要支持手机。

扩展资料:

系统结构:

Android 是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。

Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。

Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 Userspace,使得Linux driver 与 Linux kernel彻底分开。

Bionic/Libc/Kernel/ 并非标准的Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所产生的,这样做是为了保留常数、数据结构与宏。

Android 的 Linux kernel控制包括安全(Security),存储器管理(Memory Management),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型(Driver Model)等。

下载Android源码之前,先要安装其构建工具 Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。

应用组件:

1、活动

Android 中,Activity是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。

在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页

在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。

一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button按钮后,可能会跳转到其他的Activity。

和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。

当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。

可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。

2、服务

Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。

Service 是没有界面的长生命周期的代码。Service是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,来看个例子。

打开一个音乐播放器的程序,这个时候若想上网了,那么,打开Android浏览器,这个时候虽然已经进入了浏览器这个程序。

但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。

当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。

Service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

3、广播接收器

在Android 中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。

而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。

可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。

例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。

BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。

BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。

BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。

只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。

各种应用还可以通过使用Context.sendBroadcast () 将它们自己的Intent Broadcasts广播给其他应用程序。

4、内容提供

Content Provider 是Android提供的第三方应用数据的访问方案。

在Android?[16]??中,对数据的保护是很严密的,除了放在SD卡中的数据,一个应用所持有的数据库、文件等内容,都是不允许其他直接访问的。

Android当然不会真的把每个应用都做成一座孤岛,它为所有应用都准备了一扇窗,这就是Content Provider。

应用想对外提供的数据,可以通过派生Content Provider类, 封装成一枚Content Provider,每个Content Provider都用一个uri作为独立的标识。

形如:content://com.xxxxx。所有东西看着像REST的样子,但实际上,它比REST 更为灵活。

和REST类似,uri也可以有两种类型,一种是带id的,另一种是列表的,但实现者不需要按照这个模式来做,给id的uri也可以返回列表类型的数据,只要调用者明白,就无妨,不用苛求所谓的REST。

参考资料来源:百度百科-Android

(责任编辑:IT教学网)

更多

推荐网页文字特效文章