广播是我们常用的一种通信方式。但是广播是java层方法,在c层不能直接调用。如果需要通过在c层触发广播的发送,怎么去实现呢。
1、通过shell命令发送广播。
这种方式最简单,但是shell命名执行时间略长,一般需要500ms以上的时间。发送广播较慢。
system(“am boradcast -a xxxx”);
2、在c层创建一个文件,在framework层的PhoneWindowManager.java中增加一个FileObersver监听文件状态,在OnEvent方法中发出广播。这种方式实时性较高。(记得一定要检查文件的权限是否足够)。
c层的代码
File *file = NULL;
char str[4] = {0};
sprintf(str, "%d",1)
file = fopen("/data/test","w");
if (file != NULL)
{
fwrite(file,sizeof(str),1,file);
fclose(file);
}
java层代码
//framework/base/service/cor/java/com/android/server/policy/PhoneWindowManager.java
private class testFileObserver extends FileObserver {
private testFileObserver(String path) {
super(path,FileObserver.OPEN); //这里只监听OPEN方法
}
@Override
public void onEvent(int event, String path) {
final int action = event & FileObserver.ALL_EVENTS;
switch (action) {
case FileObserver.OPEN:
Intent int = new Intent("com.android.action.TEST");
mContext.sendBoradcast(intent);
break;
default:
break;
}
}
}
// 在init方法中启动文件监听
@Override
public void init(Context context, IWindowManager windowManager, WindwMangagerFuncs windowManagerFuncs){
// 省略此处代码
.........
testFileObserver testFile = new testFileObserver("/data/test");
testFile.startWatching();
.........
}
测试使用第一种方法,延时较高,接近800ms。换成第二方法之后直接降为ms级,1ms就发出了广播。
————————————————
版权声明:本文为CSDN博主「一块冬瓜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Tony_YY/article/details/89688438