android广播消息
1. android里的广播和通知有什么区别
1、广播
android通过广播来实现不同进程间的通信;对应于广播(broadcat)还有一个广播接收器(broadcast
receiver);每个广播指定了对应的action
、
type等信息,每个接收器根据这些信息来过滤是否自己要接收的广播
2、通知
Notification是Android中常用的一种通知方式,当有未读短信或者未接电话的时候,屏幕的状态栏就会有提示图标,这时可以下拉状态栏来读取通知。在使用微信的时候(微信在后台运行),如果有新消息时便会发出声音提示,状态栏也有相应的微信提示
3、安卓中广播和通知的关系
广播是接收请求,通知是把处理结果告诉用户
2. android系统下怎么广播键盘的输入消息
1.在lichee/linux-3.0/include/linux/input.h文件可以查看底层驱动的按键编码
#define KEY_F1 59
#define KEY_F2 60
#define KEY_F3 61
#define KEY_F4 62
#define KEY_F5 63
#define KEY_F6 64
#define KEY_F7 65
#define KEY_F8 66
#define KEY_F9 67
#define KEY_F10 68
2.在android4.0/frameworks/base/core/java/android/view/KeyEvent.java文件可以查看上层驱动的按键编码
/** Key code constant: F1 key. */
public static final int KEYCODE_F1 = 131;
/** Key code constant: F2 key. */
public static final int KEYCODE_F2 = 132;
/** Key code constant: F3 key. */
public static final int KEYCODE_F3 = 133;
/** Key code constant: F4 key. */
public static final int KEYCODE_F4 = 134;
/** Key code constant: F5 key. */
public static final int KEYCODE_F5 = 135;
/** Key code constant: F6 key. */
public static final int KEYCODE_F6 = 136;
/** Key code constant: F7 key. */
public static final int KEYCODE_F7 = 137;
/** Key code constant: F8 key. */
public static final int KEYCODE_F8 = 138;
/** Key code constant: F9 key. */
public static final int KEYCODE_F9 = 139;
/** Key code constant: F10 key. */
public static final int KEYCODE_F10 = 140;
3.在/android4.0/frameworks/base/data/keyboards/Generic.kl文件里面有底层到上层的映射,将这个文件定制到自己的系统android4.0/out/target/proct/crane-m1003h6/system/usr/keylayout目录下就可以了在上层收到USB键盘F1-F10的消息了。
key 59 F1
key 60 F2
key 61 F3
key 62 F4
key 63 F5
key 64 F6
key 65 F7
key 66 F8
key 67 F9
key 68 F10
4.在/android4.0/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java文件的onKeyDown,onKeyUp函数截获F1-F10的消息,用自己定义的广播消息广播出去应用就可以在后台或者前台都可以接收到按键按下或者释放的广播消息了。
case KeyEvent.KEYCODE_F1: {
//Log.e("zkliu","---------------------------test F1---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F1_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F2: {
//Log.e("zkliu","---------------------------test F2---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F2_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F3: {
//Log.e("zkliu","---------------------------test F3---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F3_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F4: {
//Log.e("zkliu","---------------------------test F4---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F4_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F5: {
//Log.e("zkliu","---------------------------test F5---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F5_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F6: {
//Log.e("zkliu","---------------------------test F6---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F6_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F7: {
//Log.e("zkliu","---------------------------test F7---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F7_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F8: {
//Log.e("zkliu","---------------------------test F8---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F8_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F9: {
//Log.e("zkliu","---------------------------test F9---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F9_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F10: {
//Log.e("zkliu","---------------------------test F10---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F10_KEYDOWN"));
return true;
}
case KeyEvent.KEYCODE_F1: {
//Log.e("zkliu","---------------------------test F1---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F1_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F2: {
//Log.e("zkliu","---------------------------test F2---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F2_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F3: {
//Log.e("zkliu","---------------------------test F3---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F3_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F4: {
//Log.e("zkliu","---------------------------test F4---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F4_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F5: {
//Log.e("zkliu","---------------------------test F5---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F5_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F6: {
//Log.e("zkliu","---------------------------test F6---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F6_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F7: {
//Log.e("zkliu","---------------------------test F7---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F7_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F8: {
//Log.e("zkliu","---------------------------test F8---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F8_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F9: {
//Log.e("zkliu","---------------------------test F9---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F9_KEYUP"));
return true;
}
case KeyEvent.KEYCODE_F10: {
//Log.e("zkliu","---------------------------test F10---------------------------");
getContext().sendBroadcast(new Intent("com.android.action.F10_KEYUP"));
return true;
}
应用程序注册接收相应的广播消息即可接收到键盘输入消息。
3. android中的广播是什么意思
android的广播概念和我们日常生活中的电台有相通之处,空气中有不同频段,不同电台的广播,而android系统中就有对应的电池的电量,来电,短信还有例如sd卡拔插等等这些广播的消息发出,这些消息就对应着用收音机调频时,不同电台的节目。而我们注册的广播就类似于我收听某个电台的节目,比如一个注册广播收听交通广播,另一个注册的广播收听音乐广播,那么怎么区分是交通广播还是音乐广播呢,这就要通过前一章提到的Intent的action来判断。
4. 简述在android中如何发送广播消息
1.发送广播
Intent intent = new Intent(BroadcastAction);
Bundle bundle = new Bundle();
bundle.putString("***", SUCCESS);
bundle.putString("FullPathName", mFullPathName);
intent.putExtras(bundle);
sendBroadcast(intent);
2.在Activity中创建一个内部类MyBroadcastReceiver扩展BroadcastReceiver,并在其中实现onReceive方法。
3.在Activity中声明一个MyBroadcastReceiver类型的成员变量,并注册:
private MyBroadcastReceiver myBroadcastReceiver;
...
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BroadcastAction);
registerReceiver(receiver, filter);
4.使用完后要记得释放
unregisterReceiver(receiver);
注:1和2中的 BroadcastAction要是同一个Action
5. 如何抓取广播队列消息 android
下面和大家分享一下android中非常重要的消息处理机制,说到消息处理,Message,MessageQueue,Looper,Handler这四个类的作用是我们必须要明白的。 下面分别谈谈他们的作用: MessageQueue MessageQueue表示消息队列,存放消息的地方,按照“先进先..则执行,每一个线程只可以拥有一个MessageQueue。当创建Looper对象的时候会创建一个MessageQueue对象。
Message
Message表示消息对象,MessageQueue中存放的对象,一个MessageQueue中可以存放多个Message对象。通过调用Message类的obtain()方法或者调用Handler类的obtainMessage()方法获取Message对象,但是这样并不一定会创建一个新的Message对象,如果消息池中有可用的Message对象则直接取出返回这个对象,否则如果消息池中没有可用的Message对象,则会创建一个新的Message对象。当消息队列中的Message对象被系统处理完之后,该Message对象会从MessageQueue中删除,然后放入消息池中。
Looper
Looper是用来操作MessageQueue的,每一个Looper对应一个MessageQueue,可以通过调用Looper.myLooper()方法获取当前线程的Looper对象,Looper循环从MessageQueue中取出Message对象,交给Handler调用handleMessage方法进行处理,处理完之后Message对象被放入消息池中。
Handler
Handler是消息的处理者,Handler将需要传递的信息封装成Message对象,然后调用sendMessage方法将Message放入MessageQueue中,当MessageQueue循环到该Message时,调用相应Handler对象的handleMessage方法对其进行处理。 http://d-android.com/developer/
注意在UI线程也就是主线程中默认会创建Looper对象和MessageQueue对象,如果在我们自己新开的线程中要进行消息处理,必须创建Looper对象和MessageQueue对象,通过调用Looper.prepare()方法可以创建Looper对象和MessageQueue对象,调用Looper.loop()方法可以启动消息循环队列。
6. Broadcast广播可以应用于andrion应用程序有哪些场景
摘要 在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。
7. android 如何自定义常驻广播
Android广播机制指的是,在一个应用程序运行的时候可以自定义一个消息类型,让相应的接收器去处理这个消息或者是系统消息,比如来电话了、来短信了、手机没电了等等系统发送的消息。系统发送的消息也可以通过广播的方式通知给应用程序,这样子就避免了新开一个Thread去监听系统或其他应用发送过来的消息的状态。
Android广播的分类:
1、 普通广播:这种广播可以依次传递给各个处理器去处理
2、 有序广播:这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除
3、 粘性消息:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态。
注意:普通广播和粘性消息不同被截获,而有序广播是可以被截获的
处理器的注册:
1、 在代码中用函数代码动态的方式注册。动态注册的处理器必须用代码动态的销毁,每次用来处理消息的就一个实例对象
2、 在配置文件里面静态注册,静态注册有个特点,那就是一旦注册就会一直存在于系统里面,无论应用是否关闭或开关机。(简直就是一个流氓软件病毒啊~)。静态注册每次有处理消息就由系统new一个处理器处理,并销毁
下面具体看看Android广播消息的发送、注册、处理过程:
① 自定义处理器类:
public class MyBroadcastReceiver4 extends BroadcastReceiver {
public MyBroadcastReceiver4() {
System.out.println("创建了一个由registerReceiver()注册的广播接收器");
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("MyBroadcastReceiver4收到了一个" + action + "消息");
if (isOrderedBroadcast()) {
System.out.println("这是一个有序广播,已经被拦截了。");
this.abortBroadcast();
} else {
System.out.println("这不是一个有序广播");
}
Bundle bundle = intent.getExtras();
if (bundle != null) {
System.out.println("该消息携带的数据如下:");
// 获得bundle的一个key的集合
Set set = bundle.keySet();
// 获得上述集合的迭代器
Iterator iterator = set.iterator();
// 用迭代器遍历集合
while (iterator.hasNext()) {
// 取得集合中的一个内容
String str = (String) iterator.next();
// 取得Bundle中的内容
System.out.println(str + "--->" + bundle.get(str));
}
} else {
System.out.println("该消息没有携带数据");
}
Toast toast = Toast.makeText(context, "MyBroadcastReceiver4收到了一个"
+ action + "消息", Toast.LENGTH_LONG);
toast.show();
//将这个消息截获(从消息容器移除)这样其他处理器就没法接收到这个消息
this.abortBroadcast();
}
}
② 发送广播消息
⑴、 发送普通广播:
// 发送一个普通消息
Intent intent = new Intent(); intent.setAction("asdfasdf");
Android_09_10Activity.this.sendBroadcast(intent);
⑵、 发送有序广播:
// 发送一个有序消息
Intent intent = new Intent();
intent.setAction("asdfasdf"); Android_09_10Activity.this.sendOrderedBroadcast(intent,
null);
⑶、 发送粘性广播:
// 发送一个粘性消息
Intent intent = new Intent();
intent.setAction("qwerqwer"); Android_09_10Activity.this.sendStickyBroadcast(intent);
③ 注册广播接收器
⑴动态注册:
// 注册一个广播接收器
IntentFilter intentFilter = new IntentFilter("asdfasdf");
intentFilter.setPriority(0);
Android_09_10Activity.this.registerReceiver(mbr2,
intentFilter);
⑵静态注册:
<receiver android:name=".MyBroadcastReceiver4" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.WALLPAPER_CHANGED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
//这一句比较特殊,是上面那个广播消息特有的
<data android:scheme="package" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
想发送粘性消息的时候必须在配置文件里面获取权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
想用自定义处理器对系统广播进行处理的话也必须在注册文件里面申明获取权限,比如:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
8. android中怎么发送带内容的有序广播
(一),BroadcastReceiver用于监听被广播的事件(Intent),为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
1、静态注册:
静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
如果在清单配置文件中配置了广播接收器,那么程序在安装后会自动注册广播接收器。
静态注册方式的特点:不管该应用程序是否处于活动状态,都会进行监听。
<receiver
android:name=".CallReceiver"
android:enabled="true">
<intent-filter >
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
其中,MyReceiver为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。<intent-filter>标签设置过滤器,接收指定action广播。
2、动态注册:
动态注册方式是在activity里面调用当前上下文对象的registerReceiver() 方法 来注册,和静态的内容差不多。一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。
动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
MyReceiver receiver = new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的广播
IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
//注册广播接收器
registerReceiver(receiver, filter);
(二)、发送广播:
// 指定广播目标Action
Intent intent = new Intent("MyReceiver_Action");
// 可通过Intent携带消息
intent.putExtra("msg", "发送广播");
// 发送广播消息
sendBroadcast(intent);
(三)、注销BroadcastReceiver:
1、一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver。
2、一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期。
//注销广播接收器
unregisterReceiver(receiver);