1.android framework
1)framework下如何添加新的功能文件?
可以根据需要在core下添加
2)android主线程无法处理耗时的认为一般耗时的任务应该创建一个线程处理。
3)广播有2中注册方法:
a. 通过androidManifest.xml文件注册,
在XMl文件中注册一个广播类并且将这个广播接收的action也声明了。
然后在代码中实现这个类就可以了。
b. 在代码中调用
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
mContext.registerReceiver(mChargerStatusReceiver, iFilter);
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
mContext.sendBroadcast(intent);
通过Intent.ACTION_BATTERY_CHANGED找到对应的广播接收端。
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
mContext.sendBroadcast(intent);
通过Intent.ACTION_BATTERY_CHANGED找到对应的广播接收端。
mChargerStatusReceiver对象是一个继承与BroadcastReceiver类的子类对象。接收处理函数接在这个类里面。
4)启动一个第三方servcer,需要在androidManifest文件中声明这个服务然后启动,开启这个服务后,不要将耗时的任务放在服务的主线程中,应该另外的启动一个线程处理。
5)radio,airplanemode,wifi,bluetooth,NFC的相关处理,kerguard的唤醒
airplanemode,一般会有一个状态保存在setting的数据库中,每次重新启动手机,都会保持上次关机时候的飞行模式状态。因此如果想要改变飞行模式状态首先修改setting中的值,然后发送一个广播ACTION_AIRPLANE_MODE_CHANGED就可以了。wifi,BT ,NFC也是有状态保存在setting数据库中,但是这三个状态受到飞行模式的制约(如果开了飞行模式,这三个的状态都会是关闭的)。每次改变这3个状态他们保存在setting中的状态也会随之改变。radio开机就会启动,
6)各类由systemservice启动的服务,都可以通过getservice获得一个manager来使用对应service对外暴露的接口,manager通过binder通信调用service的函数。service中的包import只在server这个目录下有效,在其他目录下import server中的包文件无法找到,但是server可以import外部的包文件
2.JNI
如何在android的源码中添加一个新的JNI接口文件?
在JNI的目录下的android.mk文件中添加源文件的编译命令。
在jni/AndroidRuntime.cpp文件中添加代码
extern int register_android_internal_app_DeepSleep(JNIEnv *env);
static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_internal_app_DeepSleep),
};
在/jni/android_internal_app_DeepSleep.cpp添加文件(一般的写法例子)
#include "JNIHelp.h"
#include "jni.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <stdio.h>
#include <fcntl.h>
static jboolean JNI_setDeepsleep(JNIEnv *env, jobject clazz, jboolean on)
{
return 0;
}
static jboolean JNI_getDeepsleep(JNIEnv *env, jobject clazz)
{
return ret;.
}
static JNINativeMethod method_table[] = {
{ "setDeepleep", "(Z)Z", (void*)JNI_setDeepsleep },
{ "getDeepleep", "()Z", (void*)JNI_getDeepsleep },
};
int register_android_internal_app_DeepSleep(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(env,
"com/android/internal/app/DeepSleep", method_table, NELEM(method_table));
}
};
JNI 中的C++代码如何编写可以使得JAVA和JNI正常使用?
在java中声明和c++中完全一样的函数注意native关键字