`

android 自定义核心服务

阅读更多

native service

zygote 服务


kernel->init(init.rc)->demons
zygote->dalvik VM->systemServer
runtime->serviceManager






zygote包括两部分:
c/c++层,用来产生进程给核心服务和app
java层,调用c/c++层






activityManager 活动管理器
管理activity属性和行为,管理service
示例代码:取得正在执行的
// 取得正在运行的进程
ActivityManager activityManager = (ActivityManager)


this.getSystemService(ACTIVITY_SERVICE);
// 指定最大进程数
List<RunningServiceInfo> infos =


activityManager.getRunningServices(30);
for (int i = 0; i < infos.size(); i++) {
Log.i("tag", "info" + infos.get(i).process);
}


packageManager管理应用包
// 取得已安装包
List<PackageInfo> infos = getPackageManager


().getInstalledPackages(0);
for(int i=0;i<infos.size();i++){
Log.i("tag", "package info: "+infos.get


(i).packageName);
}






windowManager视窗管理器
// WindowManager manager=(WindowManager)
// this.getSystemService(WINDOW_SERVICE);
// 取得屏幕大小
Display display = getWindowManager().getDefaultDisplay();
display.getWidth();
display.getHeight();


// 移除某个view
getWindowManager().removeViewImmediate(new View(this));
=================================================================




native Service开发要点:

c++代码:


头文件:
#include <stdint.h>
#include <sys/type.h>
#include <utils/Parcel.h>
#ifndef ANDROID_MISOO_SQRSERVICE_H
#define ANDROID_MISOO_SQRSERVICE_H
#include <utls.h>
#include <utils/Keyed/Vector.h>
#include <ui/SurfaceComposerClient.h>
namespace_android{
class SQRService:public BBinder
{
public:
static int instantiate();
virtual status_t onTransact(uint32_t,const


Parcel&,Parcel*,uint32_t);
SQRService();
virtual ~SQRService();
};
};
#endif


源文件 :
#include <utils/IServiceManager.h>
#include <utils/IPCThreadState.h>
#include <utils/RefBase.h>
#include <utils/IInterface.h>
#include <utils/Parcel.h>
#include "SQRService.h"


namespace android{
enum{
SQUARE=IBinder::FIRST_CALL_TRANSACTION,
};
int SQRService::instantiate(){
LOGE("SQRService instantiate");
int r = defaultServiceManager()->addService(
String16("misoo.sqr"), new SQRService());
LOGE("SQRService r = %d\n", r);
return r;
}
SQRService::SQRService(){
LOGV("SQRService created");
}
SQRService::~SQRService(){
LOGV("SQRService destroyed");
}
status_t SQRService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)


{
switch(code) {
case SQUARE: {
int num = data.readInt32();
reply->writeInt32(num * num);
LOGE("onTransact::CREATE_NUM.. n=%d\n", num);
return NO_ERROR;
}
break;
default:
LOGE("onTransact::default\n");
return BBinder::onTransact(code, data, reply, flags);
}}
};




makefile文件:
LOCAL_PATH:=${call my-dir}
Include ${CLEAR_VARS}
LOCALL_SRC_FILES:=\SQRService.cpp #源文件(相对于当前的目录)
#LOCAL_MODULE:=test_exe # 最终生成可执行文件的名称
LOCAL_MODULE:=libSQRS01 #模块最终的名称
LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE) #需要包含的头文件路径
#LOCAL_STATIC_LIBRARIES:= #需要连接的静态库(*.a)
LOCLA_SHARED_LIBRARIES:=\libutils #需要连接的动态库(*.so)
LOCAL_PERLINK_MODULE:=false
Include ${BUILD_SHARED_LIBRARY} # 以一个静态库的方式进行编译




添加服务:
#include <sys/types.h>
#include <unistd.h>
#include <grp.h>
#include <utils/IPCThreadState.h>
#include <utils/ProcessState.h>
#include <utils/IServiceManager.h>
#include <utils/Log.h>
#include <private/android_filesystem_config.h>
#include "../libadd/SQRService.h"
//#include <libadd/SQRService.h>
using namespace android;
int main(int argc, char** argv){
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
SQRService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}


然后将静态库文件放到模拟器的/system/lib
addService放到模拟器的/system/bin


===========================================================
提供通用API:IBinder接口



// sqr.h
#ifndef ANDROID_MISOO_SQR_H
#define ANDROID_MISOO_SQR_H


namespace android {
class SQR {
private:
const void getSQRService();
public:
SQR();
int execute(int n);
};
}; //namespace
#endif // ANDROID_MISOO_SQR_H









// sqr.cpp
#include <utils/IServiceManager.h>
#include <utils/IPCThreadState.h>
#include "SQR.h"


namespace android {
sp<IBinder> m_ib;
SQR::SQR(){
getSQRService();
}
const void SQR::getSQRService(){
sp<IServiceManager> sm = defaultServiceManager();
m_ib = sm->getService(String16("misoo.sqr"));
LOGE("SQR:getSQRService %p\n",sm.get());
if (m_ib == 0)
LOGW("SQRService not published, waiting...");
return;
}
int SQR::execute(int n) {
Parcel data, reply;


data.writeInt32(n);
LOGE("SQR::execute\n");
m_ib->transact(0, data, &reply);
int num = reply.readInt32();
return num;
}
};


============================================================


/* com_misoo_service_sqr01.h */
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_misoo_service_sqr01 */


#ifndef _Included_com_misoo_service_sqr01
#define _Included_com_misoo_service_sqr01
#ifdef __cplusplus


extern "C" {


#endif
/*
* Class: com_misoo_service_sqr01
* Method: addTest
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_misoo_service_sqr01_execute
(JNIEnv*, jobject, jint);


#ifdef __cplusplus
}
#endif
#endif








/* com_misoo_service_sqr01.cpp */
#include "com_misoo_service_sqr01.h"
#include <utils/Log.h>
#include <utils/IPCThreadState.h>
#include <utils/ProcessState.h>
#include "../core_service/SQRService.h"
#include "SQR.h"


using namespace android;
JNIEXPORT jint JNICALL Java_com_misoo_service_sqr01_execute(JNIEnv


*env,
jobject thiz, jint x)
{
char s[] = "Java_com_misoo_service_sqr01_execute!!!";
LOGE("%s X = %d\n", s, x);
SQR* sqrObj = new SQR();


int num = sqrObj->execute(x);
return num;
}


// Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
com_misoo_service_sqr01.cpp \
SQR.cpp


base := $(LOCAL_PATH)/../../..
LOCAL_C_INCLUDES := \
$(JNI_H_INCLUDE) \
$(base)/CS01
LOCAL_SHARED_LIBRARIES := \
libutils \
libSQRS01
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libSQRS01_jni
include $(BUILD_SHARED_LIBRARY)


========================================


// sqr01.java
package com.misoo.service;
public class sqr01
{
static
{ System.loadLibrary("libSQRS01_jni"); }
public static native int execute(int x);
}




// SuperSQR.java
package com.misoo.service;
abstract public class SuperSQR {
public int exec(){
return sqr01.execute(onGetX());
}
abstract public int onGetX();
}




// mySQR.java
package com.misoo.pk01;
import com.misoo.service.SuperSQR;
public class mySQR extends SuperSQR {
@Override
public int onGetX() {
return 60;
}
}




// ac01.java
package com.misoo.pk01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;


public class ac01 extends Activity implements OnClickListener {
private Button btn, btn2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
btn = new Button(this); btn.setBackgroundResource


(R.drawable.heart);
btn.setId(101); btn.setText("run");
btn.setOnClickListener(this);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(120, 55);
param.topMargin = 10;
layout.addView(btn, param);


btn2 = new Button(this); btn2.setBackgroundResource


(R.drawable.ok);
btn2.setId(102); btn2.setText("exit");
btn2.setOnClickListener(this);
layout.addView(btn2, param);
setContentView(layout);
}
public void onClick(View v) {
switch(v.getId()){
case 101:
mySQR sqr = new mySQR();
int k = sqr.exec();
setTitle("Value = " + String.valueOf(k));
break;
case 102:
finish();
break;
}
}}

分享到:
评论

相关推荐

    Android自定义控件开发入门与实战.zip

    《Android自定义控件开发入门与实战》这本书深入浅出地讲解了如何在Android平台上创建和使用自定义控件,旨在帮助开发者从基础知识到实战技巧,全方位掌握这一核心技术。 一、自定义控件基础 自定义控件在Android中...

    android自定义圆盘方向按钮

    2. **onDraw()**:这是自定义绘图的核心方法。在这里,我们使用Canvas对象进行绘制。首先,使用`canvas.drawColor()`设置背景色,然后使用`canvas.drawCircle()`绘制圆盘。为了绘制方向箭头,我们可以使用`canvas....

    Android自定义adapter的listview

    以上就是关于“Android自定义adapter的listview”的主要知识点。自定义Adapter是Android开发中的核心技能之一,掌握好这一技巧,能帮助我们实现各种复杂的界面效果。通过不断实践和优化,我们可以在保证性能的同时,...

    Android-Android自定义键盘数字键盘和字母键盘

    这个类是自定义键盘的核心,它负责处理键盘的显示、输入事件以及与其他组件的交互。 ```java public class CustomKeyboardService extends InputMethodService { // 实现相关方法 } ``` 2. 设计键盘布局 在res/...

    Android 自定义RadioGroup布局,修改源码自定义控件

    在Android开发中,有时我们可能需要对系统的默认控件进行扩展和自定义,以满足特定的设计需求或功能增强。本文将深入探讨如何自定义`RadioGroup`布局,并通过修改源码来创建一个自定义控件。`RadioGroup`是Android...

    android 自定义view比较综合的例子

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。这个“android 自定义view比较综合的例子”显然涵盖了多个高级话题,旨在帮助有一定基础的开发者提升自定义...

    Android 自定义View实现水平温度计

    总的来说,这个项目涵盖了Android自定义View的基本流程,以及图形绘制、颜色处理、动态更新等核心知识点,是学习Android自定义组件的一个良好实践。通过学习和研究,开发者不仅可以掌握自定义View的开发技巧,还能...

    Android自定义弹出框实现(修改版)完整实例源码

    这个“Android自定义弹出框实现(修改版)完整实例源码”就是一个很好的示例,它展示了如何根据自己的需求设计和构建个性化的弹出框。下面将详细介绍这个实例中的关键知识点。 首先,我们要理解Android中的弹出框...

    Android 自定义View视图

    3. **绘制视图**:自定义View的核心在于重写`onDraw(Canvas canvas)`方法。在这个方法中,使用Canvas对象进行绘图操作,如画圆、画线、设置颜色等。在罗盘的例子中,我们需要绘制指针、刻度、背景等元素。 4. **...

    Android自定义键盘之中文键盘demo

    本示例“Android自定义键盘之中文键盘demo”旨在教你如何为Android应用创建一个功能完备的中文输入键盘。下面将详细介绍这个过程中的关键知识点。 1. **Android InputMethodService(IMS)**: 自定义键盘的核心是...

    Android自定义汽车仪表

    综上所述,实现"Android自定义汽车仪表"涉及的核心知识点包括: 1. 自定义视图的创建与绘制 2. `Canvas`和`Paint`对象的使用 3. 动画的实现,如`ValueAnimator`和`ObjectAnimator` 4. 事件处理,如触摸事件 5. Java...

    android 自定义 模仿Launcher

    在Android开发中,自定义Launcher是一项常见的需求,它允许开发者创建独特的用户界面,提供与原生...通过分析和修改`ScrollLayoutGrid_v3`,可以深入了解Android自定义视图的实现,同时也可以提升解决实际问题的能力。

    android自定义圆形布局CircleLayout

    在Android开发中,自定义...总的来说,`CircleLayout`是一个很好的实例,展示了Android自定义布局的实现过程。通过学习和理解这个例子,开发者可以更好地掌握自定义布局的原理,从而在项目中创造出更多独特的界面效果。

    Android自定义桌面2.0

    而"PackageManager 2.0 android demo"则是这个项目中的一个重要组成部分,它涉及到Android系统的核心服务——PackageManager服务的升级版。 PackageManager服务是Android系统的核心组件之一,主要负责管理设备上的...

    android自定义相机黑屏问题.doc

    总之,针对Android自定义相机黑屏问题,开发者应该注意设备之间的差异,并使用如`getOptimalPreviewSize()`这样的工具函数来确保选择合适的预览尺寸。避免直接硬编码预览和拍照尺寸,以提高应用在不同设备上的兼容性...

    Android-android自定义尺子

    "Android-android自定义尺子"项目就是这样一个示例,它展示了如何在Android应用中创建一个自定义的尺子控件。这个控件可以用于教育、设计或者测量相关的应用程序,提供直观的长度或距离指示。 首先,我们要理解...

    android 自定义view及自定义属性

    在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...

    android自定义标题栏

    本教程将深入探讨如何在Android中实现自定义标题栏,主要基于提供的"android自定义标题栏源码"。 首先,我们了解Android原生标题栏的局限性。原生的ActionBar或Toolbar虽然提供了基础功能,但有时不能满足个性化的...

    android自定义3d画廊效果

    "android自定义3d画廊效果"是一个专为Android平台设计的特色功能,它通过实现3D视角的图片滚动效果,为用户提供了新颖且引人入胜的交互体验。这个3D Gallery效果的实现基于对Android系统的深入理解和熟练运用,主要...

    android自定义控件源码

    本资源"android自定义控件源码"提供了一套详细的自定义控件实现案例,帮助开发者深入理解自定义控件的工作原理和实现方法。配合文章《Android自定义控件深度解析》(文章地址:...

Global site tag (gtag.js) - Google Analytics