第一个功能的收获___DeepSleep(fastpowerOff)

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找到对应的广播接收端。 
  
 
  
                   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 
#include 
#include 
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关键字




你可能感兴趣的:(adroid,framework)